为什么我应该避免SQL数据库中的NULL值?

Yve*_*esR 3 sql database-design

我今天阅读了一个着名的商业供应商提供的针对SQL工具的45个技巧 - 数据库 - 性能提示 - 开发人员文档,有一个提示让我感到困惑:

如果可能,请避免数据库中的NULL值.如果不是,请使用适当的IS NULL和IS NOT NULL代码.

我喜欢使用NULL值,因为对我而言,如果一个值从未设置过或者它0或者是一个值,则会有所不同string empty.所以数据库有这个用于一个porpuse.

那么这个提示是无意义的,还是我应该采取措施来防止在我的数据库表中有NULL值?是否会影响性能,NULL而不是填充值numberstring值?

dzh*_*zhu 6

除了其他答案中提到的原因,我们可以从不同的角度看待NULL.

关于重复行,Codd说

如果某些事情是真的,说两次并不会使事情变得更加真实.

同样,你可以说

如果某些事情未知,说它是未知的并不能让它知道.

数据库用于记录事实.事实(真理)作为公理,我们可以从中推断出其他事实.
从这个角度来看,不应该记录未知事物 - 它们不是有用的事实.
无论如何,任何未记录的内容都是未知的.那么为什么还要记录它们呢?
更不用说他们的存在使演绎变得复杂.


Cor*_*ola 5

NULL 问题并不简单……每个专业人士对此都有个人看法。

关系理论二值逻辑(2VL:TRUE 和 FALSE)拒绝 NULL,而 Chris Date 是 NULL 的最大敌人之一。但特德·科德也接受了三值逻辑(真、假和未知)。

Oracle 需要注意以下几点:

  1. 单列 B*Tree 索引不包含 NULL 条目。因此,如果您编写“WHERE XXX IS NULL”,优化器将无法使用索引。

  2. Oracle 将 NULL 视为空字符串,因此:

    WHERE SOME_FIELD = NULL
    
    Run Code Online (Sandbox Code Playgroud)

    是相同的:

    WHERE SOME_FIELD = ''
    
    Run Code Online (Sandbox Code Playgroud)

此外,对于 NULL,您在查询中必须注意,因为每次与 NULL 的比较都会返回 NULL。有时,NULL 是阴险的。想一下如下的 WHERE 条件:

WHERE SOME_FIELD NOT IN (SELECT C FROM SOME_TABLE)
Run Code Online (Sandbox Code Playgroud)

如果子查询返回一个或多个 NULL,您将得到空记录集!

这些是我首先想谈的几个案例。但我们可以谈论 NULL 很多时间......

  • 正如批评者所说,科德并没有接受 3VL。根据证据,(a) 他接受可能必须记录 UNKNOWN,并且 (b) 他给出了一种方法,该方法不是 3VL,而是 2VL。Codd 的关系理论拒绝数据中的 NULL,但 NULL 可以出现在 ResultSet 中,因此无法回避代码必须处理 NULL 的事实,无论它是否在数据中。 (2认同)