例如,如果我在一个表中存储冗余列,我可以避免在运行时SQL查询中连接5个表。在这种情况下,存储冗余数据是否合理?我的理解是它违反了规范化规则,但我不是数据库专家 谢谢你的任何建议。
答案 0 :(得分:4)
根据我的经验,对性能进行非规范化本身并不是一种恶意,但您需要先检查一下,您无法优化针对初始3NF设计运行的查询,以便为您提供合理的时间。
这是一篇很好的文章的link,表明连接数量的减少是反规范化的常见(和良好)原因。
答案 1 :(得分:2)
我只会说我只破坏了一次规范化规则(我知道: - |)而且我从此后悔过。它给了我大约15%的速度,但为系统添加了各种额外的维护代码和脆弱性。
我会研究一下你是否不能通过更好的索引来加速连接,或者让DBMS有机会以某种方式预定义查询计划(即DBMS中的任何内容),等等。
答案 2 :(得分:1)
是的,它确实违反了规范化规则。
但你是一个大男孩。你应该知道规则以及什么时候打破它们。
五张桌子不是很多。你有什么数据告诉你,规范化会打破你的应用程序,而非规范化会解决它吗? (我猜两个都没有。)
查询速度受JOIN以上的影响:索引,WHERE子句等
规范化规则带来一定的好处和成本。在走这条路之前,你应该知道你放弃了什么。
答案 3 :(得分:1)
它确实违反了third normal form( 3NF )。但是,有时,它可以是合理的,有利于性能。收集数据库的一些使用情况统计信息,查看该查询是否耗时太长,或者是否经常使用它,并查看是否对其进行非规范化可能对您的系统有益。
显然,通过这种非规范化结构,您将不得不处理其他潜在问题。例如,您需要在冗余列和存储在其他5个表中的列之间保持一致性。
此外,在插入数据时,您必须将其存储在两个不同的位置,非规范化表格以及其他原始表格中。