NULL并非十亿美元的错误。 反租

不久前, 我在Quora上给出了这个答案 。 问题是“ NULL在SQL中的意义什么?” 并且大多数现有答案都继续引用CJ DateTony Hoare并一致宣布NULL为“ evil”

因此,每个人都一直抱怨NULL。 让我反感。

学术界

当然,像CJ Date这样的学者也会对NULL 充满怨言请参阅Greg Kemnitz对Quora的有趣回答 )。 让我提醒您,CJ Date也对UNION ALL充满怨言,因为纯关系理论仅对集合起作用,而不对包起作用(就像SQL一样)。 虽然从理论上讲,套装可能比手提袋纯净得多,但实际上,手提袋非常有用。

这些人可能仍然对SQL(有用)胜过QUEL(纯)这一事实感到哀悼,我不怪他们。 理论总是比现实世界更美,这是现实世界所必须面对的。

纯粹主义者

还有其他类型的纯粹主义者,他们会四处奔走并教育所有人关于他们的黑人/白人意见,而这些意见没有余地“取决于……”的务实方法。 我喜欢在这样的场合展示这个机智的漫画: 新实习生最了解:GOTO 。 纯粹主义者在描述自己的世界时喜欢极端抽象,而这种抽象要求非常简单的模型,而没有复杂性。 NULL给SQL“模型”增加了极大的复杂性,因此不适合他们的观点。

事实是:这取决于

唯一的事实观点是没有明确观点的观点。 NULL是一个非常有用的值,在所有要对以下形式的基数建模的语言/模型中,NULL的某些表示都是不可避免的:

  • 0 or 1 (在这里NULL有用)
  • exactly 1 (在这里,您不需要NULL)
  • 0 .. many (这里,您不需要NULL)

函数式编程语言喜欢使用可选的“ monad”( 请参见Mario Fusco对monad是什么的出色解释 )来对0或1基数建模,但这只是对NULL建模的另一种方式。 (可能)缺少的值。 也许,如果您喜欢讨论样式( 那么您应该读一下 ),NULL与Optional对您可能很重要,但是它们实际上是完全一样的。 我们只是在移动空白和花括号。

真正没有缺席值的唯一方法是禁止可选基数,而是使用0 .. many,这将大大减少描述性。

因此,无论纯粹主义者或学者对完美世界有何评价,我们的工程师都需要有效的工具来帮助我们完成工作,而NULL(或“ Optional”是使我们能够完成工作的这些有效工具之一)。

注意:SQL NULL值不存在

现在,SQL NULL的警告是它的行为不像缺少值。 正如其他人也解释过的,这是未知的价值。 这种细微的差异会对各种运算和谓词产生严重影响,如果您不了解这种区分,它们就不会非常直观地表现出来。 一些示例(还有很多示例):

即使此SQL NULL规范为UNKNOWN,大多数人还是使用SQL NULL来建模缺少的值,这在大多数情况下效果很好,直到您遇到警告为止。 事实证明,UNKNOWN值比不存在的值有用,因为它允许对事物进行更具描述性的建模。 可能有人认为拥有两个“特殊”值可以解决问题,例如JavaScript,它可以区分null (UNKNOWN)和undefined (不存在)。

JavaScript本身是有用的灯塔,与它的纯度或美观成反比,因此长话短说:

在有用的<->纯刻度上选择您喜欢的位置

编程,语言,数据模型始终是纯度和有用性之间的折衷。 在这种规模上选择自己喜欢的位置,但不要再抱怨NULL是邪恶的了。 或如西蒙·佩顿·琼斯(Simon Peyton Jones)所说:

Haskell没用

翻译自: https://www.javacodegeeks.com/2015/07/null-is-not-the-billion-dollar-mistake-a-counter-rant.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值