存储“派生”值与在提取时计算它们

时间:2010-04-21 07:22:54

标签: database database-design

如果您的值仅取决于一个或多个其他字段+/-常量(例如零售价格和折扣价格),那么存储这些值或者在检索时“动态”计算它们会更好吗?数据?

2 个答案:

答案 0 :(得分:8)

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

显然,“足够好”和“足够大”是限定符,只能在给定的上下文中表示某些内容。对于它的价值,零售/折扣价格计算似乎太便宜和简单,以保证在大多数(显然不是全部)情况下引入冗余列。

答案 1 :(得分:6)

我同意Tomislav - 尽量避免冗余,因为你最终可能会在多个表格上的数据不同意。它使更新更加痛苦。

但是,有些例外值得考虑,与数据库性能无关。

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