列取决于其他

时间:2013-09-13 15:49:47

标签: database relational-database normalization database-normalization

我有下表:

我的直觉告诉我这很糟糕,因为TOTAL可以从TIME_INTIME_OUT推断出来。

这是违规的正常形式吗?

1 个答案:

答案 0 :(得分:1)

存储作为计算结果的值通常会违反3NF。它们构成了传递依赖。

在您的情况下,传递依赖是

time_in, time_out -> total

{time_in,time_out}对不是候选键。

通常情况下(ahem),您可以通过投影解决传递依赖关系,但是当传递依赖关系涉及计算结果时,这通常不会有意义。有三个明显的选择。

  • 删除“total”列,并在每个查询中计算它。
  • 删除“total”列,并构建一个计算总数的视图(或物化视图)。
  • 保持列“total”并添加CHECK()约束以保证值始终正确。

其中每一项都可能对性能和维护产生不同的影响。