【问题标题】:Database: Can I have nullable attributes in a third normal form database?数据库:我可以在第三个范式数据库中拥有可为空的属性吗?
【发布时间】:2016-06-11 13:34:28
【问题描述】:

我有一个可以为空的winnerID 属性,该属性会根据拍卖的出价不断更新。

这个属性被设置为节省最后某个时间来计算谁赢得了拍卖。但是这个值最初是空的。

这会违反第三范式吗?我知道 1NF 的第 4 条规定我不能有可为空的属性,但注释说这是一个有争议的声明。

你能帮我澄清一下吗?谢谢!

【问题讨论】:

    标签: mysql database


    【解决方案1】:

    在 SQL 中定义空值的方式——作为无法与域值比较的非值——意味着它们违反了 1NF(以及所有更高的范式)。关系(由规范化表表示的数学结构)必须对每一行的每一列都有一个值。 Null 意味着我们没有值,可空列意味着我们在一个表中有两个关系 - 一个超类型关系包括除可空列之外的所有列,以及一个具有相同主键和先前可空列的子类型关系,对于我们只能记录属性已知的行。归一化的目的是在不丢失信息的情况下将数据集分解为基本事实,因此在一个表中包含两个关系与目标相矛盾,并使关系代数/微积分等事情变得更加复杂。

    范式是正式的逻辑定义的结构,而不是可以适应这种情况的工业最佳实践,所以我认为没有太大的争议空间。我们是否应该使用它们以及应该如何处理它们是一个更有趣的话题。

    虽然空值违反了正常形式,但这并不意味着您不能在 SQL 数据库中使用空值。他们有风险也有好处。我也使用它们,但考虑到了。

    【讨论】:

    • 当人们说 null 不是一个值时,那是无稽之谈;它只是一个被运营商特别对待的值。即当他们说SQL JOIN 是join 时,这也是无稽之谈,因为它特别对待null。当他们说 null “意味着”诸如“那里没有价值”或“那里没有价值”之类的东西时,这也是无稽之谈,因为 null 出现在一行中的含义取决于表的 谓词(用于决定一行值是否属于表的成员函数)。有有个谓词使用null,可以在在那个表中合理地描述。 ...
    • ... 但是要说这意味着句号是无稽之谈,因为对于无空表和无 3VL 运算符,输出谓词是输入谓词的某种逻辑组合,它我们依靠了解查询要求的行,但在 null 和 3VL 下并非如此。在特定输入的特定查询中,它可以是这样。 (我没有解释 我们应该如何在 null 和 3VL 下规范化。我只是在解释某些关于 null 的文章是无稽之谈,因此没有帮助,基于它的推理/解释/证明是无稽之谈,而且没有帮助。)
    • 我发现将空值视为元数据更简单。成为一个值意味着成为定义了某些运算符的集合的成员。对等式运算符中的空值的处理使逻辑模型变得非常复杂。将空值视为物理模型工件而不是逻辑工件可以使它们更易于理解和使用。
    • 我同意一个人可以采用“元数据”和/或“物理”方法,但绝对不会更简单。我可以接受“这不是关系,所以所有的赌注都没有了”。但是除了不在“元数据”或“物理”术语中给出明确的答案之外,如果它不重复许多文化上接受的公认智慧非标准模糊性,这个答案会好得多。 PS在SQL标准中定义空值的方式是根据“特殊值”,出现在行和表值中,全部由操作员操作,而不是根据本答案风格的非标准模糊性。
    • 请提供替代答案,以便我们都能接受教育。如果普通程序员可以理解,我什至会投赞成票。
    猜你喜欢
    • 2011-05-21
    • 2014-04-01
    • 2013-01-25
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-20
    • 2013-09-27
    • 2012-02-17
    相关资源
    最近更新 更多