Nulls有什么问题?

时间:2011-03-17 04:27:50

标签: database-design

我被告知在字段定义中允许空值是不好的设计......我知道它可能会导致错误......但有人可以详细说明并解释在哪种情况下我不应该允许空值和原因。什么是理论,什么是最佳实践?我想明白。

修改

我的困境是我现在必须进行db更改,代码将在稍后实现...所以我担心创建新字段NOT NULL并冒着非特定于字段的INSERT语句失败的风险。这是我不清楚的地方。我想允许NULL,因为我觉得风险较小,但其他人告诉我这是糟糕的设计。在这个阶段,我更关注在实现代码时将风险降至最低。如果有人帮我澄清我的选择,我会很感激。我缺乏信念,我需要尽快做出决定。

5 个答案:

答案 0 :(得分:2)

一,nulls引导你进入一些3值逻辑的领域。 “一些”逻辑,因为可能有很多(可能的差异之一是如何精确定义逻辑蕴涵)。无论如何,无论使用什么特定的3VL,它总会带来一些令人讨厌的惊喜,并且最多会有点不直观,或者在最坏的情况下完全无法理解。

在大多数3VL中,大量等效(/重言式)保持在2VL,不能维持,或者只有很大的困难。具有逻辑意义:在2VL中,众所周知,'p暗示q'等价于'NOT(p)OR q'。您可能会试图弄清楚经典2VL的一些非常基本的重言式如何在3VL中发挥作用。

e.g。 p => q< =>不(Q)=>不(p)的

p与否(p)< =>真

p而不是(p)< =>假的。

其次,在各种情况下,SQL主要处理空值。添加两个数字,其中一个为null,结果为null。使用某种形式的SUM()(使用相同的参数)执行相同操作,并获得数字零!在Oracle DB中插入零长度字符串,它会将其转换为null,但其他DBMS可能不会这样做(我不知道是否将某些CHAR列与零长度字符串进行相等比较(不一定是文字) ,记住你)行为正确。

第三,必须记住空值,它本质上是布尔标志,表示存在/不存在,查询编写的ADD复杂性,但大多数复杂性被SQL语言扫地,因为它提供了许多“默认行为” “(例如,当实际结果应该是UNKNOWN时,比较返回FALSE),从而使开发人员产生错误的印象,即不存在额外的复杂性,并且开发人员不需要关心这种额外的复杂性。

答案 1 :(得分:1)

如果您不允许空值,则确保您只有完整的已保存数据。 带空值的数据使您难以处理数据。

例如,如果您要显示书籍,如果您在标题上允许空值,则会导致您必须处理的问题。

如果您是数据库的新手,如果您正在进行网络开发,请查看原则。它从代码中为您生成innoDB mysql数据库(或其他数据库)。

答案 2 :(得分:1)

这太简单了。在许多情况下,你不知道 - 例如 - 一个人是否有孩子。 NumberOfChilds = 0表示:他有零个孩子,NULL表示:你不知道。

但是如果你能在整个过程中强制要求信息,最好在最深层次上强制执行。

允许NULL比让客户绕过你的逻辑更好,并用'-1 child'标记非空字段来表示“还不知道”。如果你拿走总和,现在你迷路了。或者每个人都发明了自己的密码来修补你的系统。

答案 3 :(得分:1)

正如计算机科学中经常发生的那样,这并不像“从不使用X特征”那么简单。

基本理论是SQL NULL不应该是字段所取的值 - 而是表示值 unknown 。换句话说,如果你有一个人员表并且第一个人的名字是NULL,这表明他的名字是未知的,而不是他没有名字。

问题在于这违反了“排除中间的法则”,该法则规定命题是真或假 - 一旦引入NULL,就会有“未知”的第三个真值。这可能导致各种棘手的逻辑相关错误。

实际上,构建一个必须容纳NULL值的模式并不是那么常见,但它肯定会发生。所以简短的回答是你应该要求你的所有字段都不是NULL,除非你有充分的理由不这样做。

appropriate Wikipedia page上对整个问题进行了相当详尽的讨论。

答案 4 :(得分:1)

NULL只有在数据库设计不良或其目的不明确或含糊不清的情况下才会出错。例如,假设您的数据库考虑了每个用户的地址,并创建了多个列来保存它们:address_1address_2,....当然,这是糟糕的设计:正确的方法是创建一个新表来将多个地址链接到用户。如果您的用户只有一个地址,则其余列必须保留NULL值,这纯粹是设计错误的结果。 此外,此NULL值不明确。用户是否只有一个地址?用户是否有两个地址,第二个我们不知道?地址信息不适用吗?

但是,即使正确设计和规范化数据库,当然也必须回答这些问题。那是NULL发挥作用的时候:它代表缺失和/或不适用的信息。例如,如果您知道用户有第二个地址但您不知道其邮政编码,那么NULL将适用于该字段中的值。重要的是你知道NULL在数据库中的含义,并且你是一致的。一个理想设计和填充的数据库将没有NULL,因为从理论上讲,数据库管理员将拥有所有相关信息,但在现实世界中几乎不是这样。