【发布时间】:2016-06-11 13:34:28
【问题描述】:
我有一个可以为空的winnerID 属性,该属性会根据拍卖的出价不断更新。
这个属性被设置为节省最后某个时间来计算谁赢得了拍卖。但是这个值最初是空的。
这会违反第三范式吗?我知道 1NF 的第 4 条规定我不能有可为空的属性,但注释说这是一个有争议的声明。
你能帮我澄清一下吗?谢谢!
【问题讨论】:
我有一个可以为空的winnerID 属性,该属性会根据拍卖的出价不断更新。
这个属性被设置为节省最后某个时间来计算谁赢得了拍卖。但是这个值最初是空的。
这会违反第三范式吗?我知道 1NF 的第 4 条规定我不能有可为空的属性,但注释说这是一个有争议的声明。
你能帮我澄清一下吗?谢谢!
【问题讨论】:
在 SQL 中定义空值的方式——作为无法与域值比较的非值——意味着它们违反了 1NF(以及所有更高的范式)。关系(由规范化表表示的数学结构)必须对每一行的每一列都有一个值。 Null 意味着我们没有值,可空列意味着我们在一个表中有两个关系 - 一个超类型关系包括除可空列之外的所有列,以及一个具有相同主键和先前可空列的子类型关系,对于我们只能记录属性已知的行。归一化的目的是在不丢失信息的情况下将数据集分解为基本事实,因此在一个表中包含两个关系与目标相矛盾,并使关系代数/微积分等事情变得更加复杂。
范式是正式的逻辑定义的结构,而不是可以适应这种情况的工业最佳实践,所以我认为没有太大的争议空间。我们是否应该使用它们以及应该如何处理它们是一个更有趣的话题。
虽然空值违反了正常形式,但这并不意味着您不能在 SQL 数据库中使用空值。他们有风险也有好处。我也使用它们,但考虑到了。
【讨论】: