2

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

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

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

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

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

4

5 回答 5

2

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

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

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

于 2012-09-22T20:07:18.370 回答
1

您正在谈论非规范化引用维基百科

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

将非规范化数据保存在“普通”代码中并不是一个简单的问题。记住比:

  • 您可以使用触发器保留冗余数据。
  • 如果您的架构包含ORM,则更容易保留冗余数据。
于 2012-09-22T20:13:41.647 回答
0

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

于 2012-09-22T20:26:27.303 回答
0

我很惊讶没有人提到具体化的观点。当出于性能原因维护数据聚合时,这些对象非常有用,而不会违反我们实际数据的规范化。 了解更多

于 2012-09-23T22:36:34.110 回答
0

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

于 2012-09-24T14:05:10.710 回答