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

Mat*_*iva 7 database database-design

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

Tom*_*vic 8

默认情况下不存储冗余信息:第三种常规形式通常是明智的初始目标.当出现"足够好"的原因时会引入冗余,例如,当您必须计算派生值并且计算密集时,您会采取"足够大"的性能.

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


Joe*_*win 6

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

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

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