【问题标题】:Should i recalculate big amounts of data from tables, or should I save it in my database?我应该从表中重新计算大量数据,还是应该将其保存在我的数据库中?
【发布时间】:2012-09-14 20:41:51
【问题描述】:

我的问题比具体的更笼统,但我正在使用一个例子来转移这个想法。

我有一个论坛,在每次回放中我都会展示用户拥有的消息数量。

假设在某些页面中有 15 个不同的用户,每个用户有超过 20,000 条消息,我应该通过计算用户在消息表中的条目数来重新计算消息数,还是在包含此数据的 users 表,并在每次做出回复时更新该列?

我知道它违反了数据库规范化规则,但每次都计算它似乎是一种很大的浪费。

如果重要的话,我正在使用 mySQL。

【问题讨论】:

    标签: mysql sql database database-design database-normalization


    【解决方案1】:

    一般不会,但在某些特定情况下,可以。

    您应该避免在数据库中包含冗余数据。但是,有时您必须做出权衡才能获得不错的性能。

    我实际上已经完成了您示例中的操作。它对性能很有用,但很难保持消息计数正确。您迟早会得到一些不一致的值,因此您需要计划如何定期检查这些值并重新计算它们。

    【讨论】:

    • 你可以有一个每日 cron 作业来重新计算它们。
    【解决方案2】:

    你说的是denormalizationQuoting wikipedia:

    反规范化是尝试优化读取的过程 通过添加冗余数据或分组来提高数据库的性能 数据。

    将非规范化数据保存在“纯”代码中并非易事。记住比:

    • 您可以使用触发器保留冗余数据。
    • 如果您的架构包含 ORM,则更容易保留冗余数据。

    【讨论】:

      【解决方案3】:

      您还可以在非规范化中进行一半:有一个包含每个用户每月数据的表格,由每月工作填充,并通过计算自每月 1 日以来的 msg + 每月总和即时计算消息数量数据。或者,如果您不需要每月数据,您仍然可以在一个月内即时计算 + 更新 EOM 数字的每月流程。这样可以避免触发...

      【讨论】:

        【解决方案4】:

        我很惊讶没有人提到物化视图。在出于性能原因维护数据聚合时,这些对象非常有用,而不会违反我们实际数据的规范化。 Find out more.

        【讨论】:

          【解决方案5】:

          您是否尝试过对计算行数的结果进行基准测试? 我建议您只是在视图中进行计算。通过您提出的非规范化,您只是将自己暴露在数据损坏的风险中。然后,帖子计数列将以与帖子数量的实际情况无关的任意值结束。

          【讨论】:

            猜你喜欢
            • 2021-06-27
            • 1970-01-01
            • 1970-01-01
            • 2010-12-28
            • 2011-01-16
            • 2012-08-14
            • 2021-01-31
            • 2013-04-06
            • 2014-07-04
            相关资源
            最近更新 更多