Database design 什么';空值有什么问题?

Database design 什么';空值有什么问题?,database-design,Database Design,我被告知在字段定义中允许空值不是好的设计。。。我知道这会导致错误。。。但有人能详细解释一下,在什么情况下我不允许空值,为什么。什么是理论,什么是最佳实践?我想了解 编辑 我的难题是我现在必须修改数据库,代码将在以后实现。。。因此,我担心创建不为NULL的新字段以及非字段特定的INSERT语句失败的风险。这是我不清楚的地方。我想允许NULL,因为我认为它风险较小,但其他人告诉我这是一个糟糕的设计。在这个阶段,我更关心的是在实现代码时最小化风险。如果有人能帮我澄清我的选择,我将不胜感激。我缺乏信心,

我被告知在字段定义中允许空值不是好的设计。。。我知道这会导致错误。。。但有人能详细解释一下,在什么情况下我不允许空值,为什么。什么是理论,什么是最佳实践?我想了解

编辑


我的难题是我现在必须修改数据库,代码将在以后实现。。。因此,我担心创建不为NULL的新字段以及非字段特定的INSERT语句失败的风险。这是我不清楚的地方。我想允许NULL,因为我认为它风险较小,但其他人告诉我这是一个糟糕的设计。在这个阶段,我更关心的是在实现代码时最小化风险。如果有人能帮我澄清我的选择,我将不胜感激。我缺乏信心,需要尽快做出决定。

如果不允许空值,请确保只保存完整的数据。 带有空值的数据使您很难处理这些数据

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


如果您是数据库新手,如果您可能正在进行Web开发,请看一看原则。它根据代码为您生成innoDB mysql数据库(或其他数据库)。

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

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


如果您是数据库新手,如果您可能正在进行Web开发,请看一看原则。它根据代码为您生成innoDB mysql数据库(或其他数据库)。

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

但是,如果您可以在整个过程中强制执行信息,那么最好在最深层次上强制执行它


允许NULL比让客户绕过您的逻辑,并用'-1 child'标记非NULL字段以表示“还不知道”要好。如果你拿了这笔钱,你就输了。或者每个人都发明了自己的密码来修补你的系统

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

但是,如果您可以在整个过程中强制执行信息,那么最好在最深层次上强制执行它


允许NULL比让客户绕过您的逻辑,并用'-1 child'标记非NULL字段以表示“还不知道”要好。如果你拿了这笔钱,你就输了。或者每个人都发明了自己的密码来修补你的系统

正如计算机科学中经常发生的那样,这并不像“永远不要使用功能X”那么简单

基本理论是,SQL NULL不应该是字段接受的值——相反,它表示值是未知的。换句话说,如果您有一个people表,并且第一个人的名字为NULL,这表明他的名字是未知的,而不是他没有名字

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

在实践中,构建一个必须容纳空值的模式并不常见,但它肯定会发生。因此,简短的回答是,您应该要求所有字段都不为NULL,除非您有很好的理由这样做


整个问题在计算机上有相当详尽的讨论。

正如计算机科学中经常发生的那样,这并不像“永远不要使用功能X”那么简单

基本理论是,SQL NULL不应该是字段接受的值——相反,它表示值是未知的。换句话说,如果您有一个people表,并且第一个人的名字为NULL,这表明他的名字是未知的,而不是他没有名字

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

在实践中,构建一个必须容纳空值的模式并不常见,但它肯定会发生。因此,简短的回答是,您应该要求所有字段都不为NULL,除非您有很好的理由这样做


关于整个问题,在上有一个相当详尽的讨论。

NULL
是错误的,只有当它是由于糟糕的数据库设计造成的,或者如果它的目的不明确或模棱两可。例如,假设您的数据库考虑每个用户的地址,并创建多个列来保存它们:
address_1
address_2
。这当然是糟糕的设计:正确的方法是创建一个新表,将多个地址链接到用户。如果您的用户只有一个地址,其余的列将必须保留
NULL
值,这纯粹是设计错误的结果。 此外,此
NULL
值不明确。用户是否只有一个地址?用户是否有两个地址,第二个地址我们不知道?地址信息是否不适用

当然,这些问题必须得到回答,即使数据库的设计和规范是正确的。当
NULL
起作用时:它表示缺少和/或不适用的信息。例如,如果您知道用户有第二个地址,但不知道其邮政编码,则
NULL
将适用于