【问题标题】:Storing "derived" values vs calculating them on extraction存储“派生”值并在提取时计算它们
【发布时间】:2011-02-10 11:31:43
【问题描述】:

当您的值仅取决于一个或多个其他字段 +/- 常量(例如零售价和折扣价)时,最好也存储这些值或在检索数据时“即时”计算它们?

【问题讨论】:

    标签: database database-design


    【解决方案1】:

    默认情况下不存储冗余信息:third normal form 通常是一个明智的初始目标。当出现“足够好”的原因时会引入冗余,例如当您必须计算派生值并且计算量很大时会受到“足够大”的性能影响。

    显然,“足够好”和“足够大”是限定词,仅表示特定上下文中的某些内容。就其价值而言,零售/折扣价格计算似乎太便宜且太简单,以至于在大多数(显然不是全部)情况下都需要引入冗余列。

    【讨论】:

      【解决方案2】:

      我同意 Tomislav 的观点 - 尽量避免冗余,因为最终可能会导致多个表上的数据相互不一致。它使更新更加痛苦。

      但也有一些与数据库性能无关的例外情况值得考虑。

      • 当计算值很痛苦时(例如一些复杂的数学函数),那么存储是有意义的(您可以将列想象为“最后计算的值”)。
      • 您的输入可能会随时间而变化,例如fee 是从费率派生的,但费率作为单个值存储在配置表中。您可能想要记录费用,因为历史费用只能根据当前费率计算。或者,您也可以按时间存储速率以规避此问题。
      • 如果派生的值可以被用户输入或其他过程覆盖,那么存储也是有意义的。或者,您可以使用“CALCULATED”和“OVERRIDDEN”两种状态对此进行建模,以便仅在后一种状态下存储值。

      【讨论】:

      • 嗯。案例 2 和案例 3 与冗余没有任何关系,因为在这两个用例中,信息都变得独特,即根据定义不是冗余的。
      • @TomislavNakic-Alfirevic 有时查看看起来(有些人可能假设)相同的相邻案例会有所帮助。但你是绝对正确的。
      猜你喜欢
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-21
      • 2017-03-06
      • 1970-01-01
      • 2013-05-09
      相关资源
      最近更新 更多