我应该在db模式中允许空值吗?

jve*_*ema 27 sql database database-design

我在逻辑上知道,在某些情况下,NULL值在DB模式中有意义,例如,如果未指定某些值plain.也就是说,在代码中处理DBNull往往是一种皇家的痛苦.例如,如果我正在渲染一个视图,并且我想要查看一个字符串,我希望没有值是一个空字符串,而不是"Null",我讨厌必须围绕该场景进行编码.

此外,它使查询更容易.不可否认,你可以很容易地做"foo is not null",但是对于初级SQL开发人员来说,不能使用"foo!= null"是违反直觉的(是的,我知道关闭ANSI空值等的选项) ,但这绝对不简单,我不喜欢远离标准).

有什么理由在数据库模式中拥有/允许空值?

Aar*_*ton 41

允许NULLS的最重要原因是没有合理的替代方案.逻辑上,NULL值表示"未定义".由于缺少NULLS,您最终会尝试在未定义结果的地方指定"虚拟"值,然后您必须在所有应用程序逻辑中考虑所述"虚拟"值.

我写了一篇关于在数据库中包含NULL值的原因的博客文章.你可以在这里找到它.简而言之,我确信NULL值是数据库设计的一个组成部分,应该在适当的地方使用.


Mar*_*ton 11

CJ Date在其着作"SQL and Relational Theory"(2009:O'Reilly; ISBN 978-0-596-52306-0)中对NULL表示强烈反对.他演示了SQL中是否存在NULL会给某些查询提供错误的答案.(该参数不适用于关系模型本身,因为关系模型不允许NULL.)

我会试着用文字总结他的例子.他提出了一个表S,其中包括SNO(供应商编号)和城市(供应商所在的城市)和一行:(S1,伦敦).表P还具有属性PNO(部件号)和城市(产生部件的城市)和一行:(P1,NULL).现在他执行查询"获取(SNO,PNO)对,其中供应商和部分城市不同,或者部分城市不是巴黎(或两者)."

在现实世界中,P1是在巴​​黎或不是巴黎的城市生产的,因此查询应返回(S1,P1),因为部分城市要么是巴黎,要么不是巴黎.(表P中仅仅存在P1意味着该部分有一个与之相关的城市,即使是未知的.)如果是巴黎,则供应商和部分城市是不同的.如果它不是巴黎,那么部分城市不是巴黎.但是,根据三值逻辑的规则,('London'<> NULL)计算到UNKNOWN,(NULL <>'Paris')计算为UNKNOWN,UNKNOWN或UNKNOWN减少到UNKNOWN,这不是TRUE(而不是FALSE()),因此不返回该行.查询"SELECT S.SNO,P.PNO FROM S,P WHERE S.CITY <> P.CITY OR P.CITY <>'Paris'"的结果是一个空表,这是错误的答案.

我不是专家,现在没有能力在这里接受专业人士或骗子.我认为CJ Date是关系理论的最重要权威之一.

PS您也可以将SQL用作关系数据库之外的其他内容.它可以做很多事情.


Qua*_*noi 6

有什么理由在数据库模式中拥有/允许空值?

从理论的角度来看,有一种NULL方法是没有为列定义值.

在任何需要说" 我不知道/我不在乎 "的地方使用它来回答" 这个专栏的价值是什么? "的问题.

从性能的角度来看,这里有一些提示:

  • Oracle,NULL没有索引.您可以使用NULL's表示不需要索引的值来保存索引空间并加快查询速度.
  • Oracle,尾随NULL不占空间.
  • 与零不同,NULL可以安全地除以.
  • NULL确实做出了贡献COUNT(*),但没有做出贡献COUNT(column)