【问题标题】:Is it justifiable to store redundant data in a RDBMS to simplify queries?将冗余数据存储在 RDBMS 中以简化查询是否合理?
【发布时间】:2012-09-01 21:10:01
【问题描述】:

例如,如果我在一个表中存储一个冗余列,我可以避免在运行时 SQL 查询中连接 5 个表。在这种情况下,存储冗余数据是否合理?我的理解是它违反了规范化规则,但我不是数据库专家。
感谢您的建议。

【问题讨论】:

    标签: mysql sql rdbms


    【解决方案1】:

    确实违反了third normal form (3NF)。但是,有时,它可能是合理的,有利于性能。收集一些数据库的使用统计信息,看看该查询是否花费了太长时间,或者它是否被非常频繁地使用,并查看非规范化它是否对您的系统有益。

    显然,使用这种非规范化结构,您必须处理其他潜在问题。例如,您需要在冗余列与存储在其他 5 个表中的列之间保持一致性

    此外,在插入数据时,您必须将其存储在两个不同的位置,非规范化表以及其他原始表中。

    【讨论】:

      【解决方案2】:

      我只会说我只违反了一次规范化规则(我知道 :-|),从那以后我就后悔了。它使我的速度提高了大约 15%,但给系统添加了各种额外的维护代码和脆弱性。

      我会研究您是否不能通过更好的索引来加速连接,或者让 DBMS 有机会以某种方式预定义查询计划(即 DBMS 中的任何内容)等等。

      【讨论】:

        【解决方案3】:

        根据我的经验,为提高性能而进行非规范化本身并不是什么坏事,但您需要首先检查您是否无法优化针对初始 3NF 设计运行的查询,以便为您提供合理的时间安排。

        这是一篇很好的文章的link,它表明减少连接数量是非规范化的一个常见(也是很好的)理由。

        【讨论】:

          【解决方案4】:

          是的,它确实违反了规范化规则。

          但你是个大男孩。你应该知道规则以及什么时候打破规则是合适的。

          五张桌子不是很多。你有什么数据可以告诉你规范化会破坏你的应用程序,而非规范化会修复它? (我猜两者都没有。)

          影响查询速度的不仅仅是 JOIN:索引、WHERE 子句等

          规范化规则有一定的好处和成本。在你走这条路之前,你应该知道你放弃了什么。

          【讨论】:

            猜你喜欢
            • 2021-12-31
            • 2019-03-29
            • 2015-01-23
            • 1970-01-01
            • 2013-05-20
            • 2013-09-09
            • 2016-06-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多