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