有10个表,我就没有联接。有了100个表,每个查询我会有一个连接。哪个会表现出更好的表现?
答案 0 :(得分:10)
如果没有一些测量的性能数据,我不会以这种方式做出设计决定。
建模问题的正确方法是使用索引来创建规范化表,这些索引可以忠实地为问题域建模。
完成后,获取一些您需要运行的查询的性能数据。
如果您发现性能不可接受,请根据需要进行非规范化。
你的问题过于笼统和笼统,无法做出黑白决定。
答案 1 :(得分:8)
我认为这很大程度上取决于您的数据库架构,但是对于表来说,10k行并不是很多。如果您可以在数据上添加索引,请执行此操作。我认为较少的表应该使您的应用程序更简单。
另外,要说明显而易见的,连接比非连接更昂贵,因为要计算连接,您需要获取两个表的交叉产品(或其任何调用),然后从中获取行。但同样,我不知道你的数据是什么样的。
答案 2 :(得分:2)
联接具有性能影响。但是,拥有冗余数据也是一种不好的做法。在这些情况下,更新和插入数据会非常繁重。
答案 3 :(得分:0)
更少的联接意味着更快的选择查询。但是,如果您正在进行任何插入或更新,您很可能会通过数据异常或更昂贵的插入/更新来支付费用。
如果它只是你要查询的静态数据,那么非规范化可以得到回报,但否则你可能会自己开枪。
答案 4 :(得分:0)
从正确的架构开始,一个包含100,000行的表,如果只有一个逻辑实体....
否则,请首先设置您的域并设计您的架构,最重要的是镜像它必须表示的逻辑域实体。然后,只进行非规范化以解决实际出现在负载测试中的那些性能问题,(或者,根据过去的经验,您知道将自己出现)这种方法,(从正确的规范化模式开始),将使调整过程本身更容易,它将有助于保证您最终得到的内容将包含归一化和优化的最佳组合,并且它将确保您了解对性能进行归一化的哪些妥协。后一点是一件好事,因为它允许您更智能地添加必要的应用程序验证,以解决规范化已被破坏的情况,因此,您的数据库容易受到数据重复或不一致的影响。
如果您只关心性能,那么,您的最佳选择只是一个包含100,000行的表 - 顺便说一句,不要使用关系数据库,那就是没有意义,只需将数据存储在内存中。