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
将适用于