Yve*_*esR 3 sql database-design
我今天阅读了一个着名的商业供应商提供的针对SQL工具的45个技巧 - 数据库 - 性能提示 - 开发人员文档,有一个提示让我感到困惑:
如果可能,请避免数据库中的NULL值.如果不是,请使用适当的IS NULL和IS NOT NULL代码.
我喜欢使用NULL值,因为对我而言,如果一个值从未设置过或者它0或者是一个值,则会有所不同string empty.所以数据库有这个用于一个porpuse.
那么这个提示是无意义的,还是我应该采取措施来防止在我的数据库表中有NULL值?是否会影响性能,NULL而不是填充值number或string值?
除了其他答案中提到的原因,我们可以从不同的角度看待NULL.
关于重复行,Codd说
如果某些事情是真的,说两次并不会使事情变得更加真实.
同样,你可以说
如果某些事情未知,说它是未知的并不能让它知道.
数据库用于记录事实.事实(真理)作为公理,我们可以从中推断出其他事实.
从这个角度来看,不应该记录未知事物 - 它们不是有用的事实.
无论如何,任何未记录的内容都是未知的.那么为什么还要记录它们呢?
更不用说他们的存在使演绎变得复杂.
NULL 问题并不简单……每个专业人士对此都有个人看法。
关系理论二值逻辑(2VL:TRUE 和 FALSE)拒绝 NULL,而 Chris Date 是 NULL 的最大敌人之一。但特德·科德也接受了三值逻辑(真、假和未知)。
Oracle 需要注意以下几点:
单列 B*Tree 索引不包含 NULL 条目。因此,如果您编写“WHERE XXX IS NULL”,优化器将无法使用索引。
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 很多时间......