我今天从一家着名的商业供应商那里阅读了 45-tips-database-performance-for-developers-for开发文档,有一个提示让我感到困惑:
如果可能,请避免数据库中的NULL值。如果没有,请使用 适当的IS NULL和IS NOT NULL代码。
我喜欢使用NULL值,因为对我而言,如果从未设置过值或0
或string empty
,则会有所不同。所以数据库就是为了一个porpuse。
这个提示是无意义的,还是应该采取措施防止在我的数据库表中有NULL值?它是否会影响效果很多NULL
值而不是填充number
或string
值?
答案 0 :(得分:6)
除了其他答案中提到的原因,我们可以从不同的角度看待NULL。
关于重复的行,Codd说
如果某些事情是真的,说两次就不会再这么说了。
同样,你可以说
如果某些事情未知,说它是未知的并不能让它知道。
数据库用于记录事实。事实(真理)作为公理,我们可以从中推断出其他事实 从这个角度来看,不应该记录未知事物 - 它们不是有用的事实 无论如何,任何未记录的内容都是未知的。那么为什么还要记录它们呢? 更不用说他们的存在使演绎变得复杂。
答案 1 :(得分:3)
NULL问题并不简单......每个专业人士都有个人意见。
关系理论双值逻辑(2VL:TRUE和FALSE)拒绝NULL,而Chris Date是NULL的最大敌人之一。但是Ted Codd也接受了三值逻辑(TRUE,FALSE和UNKNOWN)。
Oracle需要注意几点:
单列B *树索引不包含NULL条目。因此,如果您编写“WHERE XXX IS NULL”,优化程序将无法使用索引。
Oracle认为NULL与空字符串相同,因此:
WHERE SOME_FIELD = NULL
与:
相同WHERE SOME_FIELD = ''
此外,对于NULL,您必须在查询中注意,因为每次与NULL的比较都返回NULL。 而且,有时,NULL是阴险的。想一下WHERE条件,如下所示:
WHERE SOME_FIELD NOT IN (SELECT C FROM SOME_TABLE)
如果子查询返回一个或多个NULL,则会获得空记录集!
这是我想谈的最初几个案例。但是我们可以在很长一段时间内谈论NULL ......
答案 2 :(得分:2)
我认为在数据库中使用NULL值是可行的,直到你的应用程序有一个适当的逻辑来处理它,但根据这篇文章,可能会有一些问题,如这里讨论的 http://databases.aspfaq.com/general/why-should-i-avoid-nulls-in-my-database.html
答案 3 :(得分:2)
NULL的各种缺点使得使用它们比实际值更难。例如:
对于字符串列,可能适合使用“N / A”或“N / K”作为特殊值来帮助区分可能为NULL的不同类别,但对于数字或日期来说这很棘手 - 特殊值通常很难使用,最好添加一个额外的列(例如,对于date_of_birth,您可能有一个指定“reason_for_no_date_of_birth”的列,这可以帮助应用程序更有用。
对于许多数据值确实未知或不相关的情况,它们当然是完全合适的 - date_of_death是一个很好的例子,或者date_of_account_termination。
有时甚至可以通过将事件规范化到不同的表来使这些示例变得无关紧要,因此您有一个“ACCOUNT_DATES”表,其中DATE_TYPES为“Open”,“Close”等。
答案 4 :(得分:2)
避免或尽量减少使用空值通常是一种好习惯。 Null会导致某些查询返回“不正确”的结果(即结果不符合数据库的预期含义)。不幸的是,SQL和SQL风格的数据库可能会使空值难以避免,尽管不一定是不可能的。这是一个非常现实的问题,甚至专家也经常难以发现由空值引起的查询逻辑中的缺陷。
由于在现实世界中没有像null这样的东西,使用它们意味着以数据库代表现实的方式做出一些妥协。事实上,没有单一的“无效”意义,也没有就它们的用途达成一致意见。在实践中,nulls用于表示各种不同的情况。如果您确实使用它们,那么最好准确记录null对于任何给定属性的含义。
以下是关于Chris Date的“无效问题”的精彩演讲: