除了是否应该使用 NULL 的争论之外: 我负责一个现有的使用 NULL 表示“丢失或从未输入”数据的数据库。它不同于空字符串,空字符串意味着“用户设置此值,并选择‘ em pty’”
该项目的另一个承包商坚定地站在“ NULL 对我来说并不存在; 我从不使用 NULL,其他人也不应该使用 NULL”的立场上。然而,令我困惑的是,由于承包商的团队确实承认“丢失/从未输入”和“故意空白或用户指示为未知”之间的区别,他们在整个代码和存储过程中使用单个字符“ Z”来表示“丢失/从未输入”,在整个数据库中使用与 NULL 相同的含义。
尽管我们的共享客户要求更改这个属性,我也支持这个请求,但是团队将其作为比我先进得多的 DBA 中的“标准实践”; 他们不愿意仅仅因为我的无知请求而更改为使用 NULL。那么,有人能帮我克服我的无知吗?在 SQL 专家中,是否有任何标准,或者一小群人,甚至是一个单独的声音提倡使用“ Z”代替 NULL?
我收到了承包商的回复。下面是当客户要求删除特殊值以允许在没有数据的列中使用 NULL 时他所说的话:
基本上,我设计数据库是为了尽可能避免 NULL:
• 字符串[ VARCHAR ]字段中不需要 NULL,因为空(零长度)字符串提供完全相同的信息。
• 整数字段(例如,ID 值)中的 NULL 可以通过使用数据中永远不会出现的值来处理(例如,整数 IDENTITY 字段为 -1)。
• 日期字段中的 NULL 很容易导致日期计算的复杂性。例如,在计算日期差异的逻辑中,比如[ RecoveryDate ]和[ OnsetDate ]之间的天数差异,如果一个或两个日期都为 NULL,逻辑就会崩溃——除非明确允许两个日期都为 NULL。这是额外的工作和额外的操作。如果对[ RecoveryDate ]和[ OnsetDate ]使用“ default”或“ placeholder”日期(例如,“1/1/1900”) ,数学计算可能会显示“异常”值——但日期逻辑不会崩溃。
传统上,NULL 处理是开发人员在存储过程中犯错误的领域。
在我15年的 DBA 生涯中,我发现尽可能避免 NULL 是最好的。
这似乎验证了对这个问题的大多数消极反应。不是应用公认的6NF 方法来设计 NULL,而是使用特殊值来“尽可能避免 NULL”我以一种开放的心态发布了这个问题,我很高兴我学到了更多关于“ NULL 是有用的/NULL 是邪恶的”的争论,但是我现在非常舒服地将“特殊值”方法标记为完全无意义的。
空(零长度)字符串提供完全相同的信息。
不,它不是; 在我们正在修改的现有数据库中,NULL 表示“从未输入”,空字符串表示“作为空值输入”。
传统上,NULL 处理是开发人员在存储过程中犯错误的领域。
是的,但是这些错误已经被成千上万的开发人员犯过成千上万次了,避免这些错误的教训和警告已经被记录下来了。正如这里提到的: 无论接受还是拒绝 NULL,缺少值的表示都是 解决了问题。没有必要仅仅因为开发人员继续犯易于克服(和易于识别)的错误而发明新的解决方案。
作为一个脚注: 我已经做了20多年的数据库工程师和开发人员(这足以让我知道数据库工程师和数据库管理员之间的区别)。在我的整个职业生涯中,我一直是“ NULL 是有用的”阵营,尽管我知道有几个非常聪明的人不这么认为。我对“特殊价值观”的方法持极度怀疑态度,但对“如何避免正确的方法为零”的学术知识还不够精通,因此不能坚定立场。我总是喜欢学习新的东西ーー而且20年过去了,我还有很多东西要学。感谢所有为这次讨论做出贡献的人。