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