归一化或不归一化

Ada*_*son 5 postgresql normalization database-design

总的来说,我知道即使有加入成本,规范化通常也是有益的。然而,我最近想到了一个有趣的困境。

如果数据重复但不太可能改变怎么办。这是可能的,但我不会预料到。

我有一个nutrients表,一unit列和单位将gkgug,等。

我看不到这些值每次都在变化。

我很想将它们作为表中的一列,而不是规范化并拥有一个units表并使用外键并且在从nutrients表中获取一行时必须加入。同时,我知道总的来说,即使有加入币,我们也应该正常化。

我应该怎么做(以及为什么)?

Joe*_*own 15

冗余数据(坏)和巧合重复数据(不坏)之间存在差异。规范化是一种用于避免插入、更新和删除异常的技术。它并不意味着消除一段数据的每一次重复。静态数据不会从规范化中受益。

以标准化缩写表示的度量单位不是您需要标准化的数据类型。

可以这样想:如果要将度量单位规范化为单独的表,则需要从nutrients表到units表的外键。度量单位代码是否将是唯一的(可能是)。因此,它是您的表的候选键units。如果是在一个候选键units,你可以使用它作为一个外键nutrients

最终结果是,nutrients即使您已经标准化了单位,您的表中仍然有您的度量单位代码。

下面是当你要创建一个units表。如果您有其他依赖于单位代码但不依赖于营养素的谓词(列)。例如,aunit_type或转换因子到相同类型的基本单位(克表示重量等)。这将是您表中的传递函数依赖项nutrients,因此不属于那里。

  • @AdamThompson 您必须评估度量单位代码更改的风险。假设出于某种原因,整个世界决定 _gram_ 的符号将从 `g` 变为 `gr`。如果发生这种情况并且您没有使用无意义的外键作为度量单位,那么您必须对您的“营养”表运行一个更新语句来进行此更改。有那么糟糕吗?这就是你必须决定的。所有的设计都是权衡。我个人不会标准化度量单位。他们真的不会改变,如果他们改变了也没什么大不了的。 (2认同)