【问题标题】:Does storing aggregated data go against database normalization?存储聚合数据是否违反数据库规范化?
【发布时间】:2011-10-07 09:07:58
【问题描述】:

在像 SO 这样的网站上,我确信绝对有必要存储尽可能多的聚合数据,以避免在每次页面加载时执行所有这些复杂的查询/计算。例如,存储每个问题/答案的投票计数,或存储每个问题的答案数量,或问题被查看的次数,以便不需要经常执行这些查询.

但是这样做是否违反了数据库规范化或任何其他标准/最佳实践?最好的方法是什么,例如,每个表是否应该有另一个用于聚合数据的表,是否应该将其存储在它所代表的同一个表中,何时应该更新聚合数据?

谢谢

【问题讨论】:

  • “正常化直到它受伤,非正常化直到它工作”
  • 很有趣的说法,但它并没有真正回答我的问题......
  • 我不禁注意到您已经提出了 72 个问题并且只投了 7 个赞。这似乎相当低?
  • 点赞有助于鼓励人们回答你未来的问题(假设他们提供了一些价值)

标签: database normalization aggregation


【解决方案1】:

存储聚合数据本身并不违反任何标准形式。规范化只关注由于函数依赖、多值依赖和连接依赖引起的冗余。它不处理任何其他类型的冗余。

【讨论】:

  • 这只能回答一半的问题。它与最佳实践无关;它只是引用规范化。此外,others argue 存储聚合确实违反了第三范式。
  • 普通形式只处理单个关系内的依赖关系,即functional dependencies。他们忽略了记录间的依赖关系,这是由@RileyMajor 链接的文章所描述的。因此,尽管记录间/关系间的依赖关系会导致冗余,例如从其他关系计算的聚合数据,但传统的范式并不关心它们。有关详细信息,请参阅此 simple guidethis paper
【解决方案2】:

要记住的短语是“规范化直到它受伤,非规范化直到它起作用”

这意味着:规范所有域关系(至少到第三范式 (3NF))。如果您衡量缺乏性能,则调查(并衡量)非规范化是否会带来性能优势。

所以,是的。存储聚合数据“不利于”规范化。

没有“最好的方法”去规范化;这取决于您对数据的处理方式。

应该以与过早优化相同的方式处理非规范化:除非您已经衡量了性能问题,否则不要这样做。

【讨论】:

  • 你是说存储聚合数据违反了3NF?为什么会这样?
  • @dportas:聚合由其他数据组成:这意味着您基本上将数据保存在 2 个位置。它们可能与 3NF 的定义不矛盾......
【解决方案3】:

过多的标准化会损害性能,因此在现实世界中,您必须找到自己的平衡点。

我以两种方式处理过这种情况。

1) 使用 DB2 我使用了一个 MQT(物化查询表),它像视图一样工作,只是它由查询驱动,您可以安排您希望它刷新的频率;例如每 5 分钟然后该表存储计数值。

2) 在软件包本身中,我将这样的信息设置为系统变量。因此,在 Apache 中,您可以设置系统范围的变量并每 5 分钟刷新一次。那么它有点准确,但您只需要每五分钟运行一次“count(*)”查询。您可以让守护程序运行它或让它由页面请求驱动。

我使用了一个包装类来做到这一点,所以它已经有一段时间了,但我认为在 PHP 中很简单: $_SERVER['report_page_count'] = array('timeout'=>1234569783, 'count'=>15);

尽管如此,但是您存储了单个值,这样您就不必在每次请求时都运行它。

【讨论】:

  • “过多的标准化会损害性能”——这是不正确的。
猜你喜欢
  • 2012-01-25
  • 1970-01-01
  • 2017-01-23
  • 1970-01-01
  • 2013-06-09
  • 1970-01-01
  • 2012-07-01
  • 2014-07-29
  • 2015-06-10
相关资源
最近更新 更多