cle*_*tus 37
不.在适当的位置将列设置为NULL是个好主意.
Fra*_*rth 32
我有点不同意"适当的"规则.将任何列设置为NOT NULL 实际上是相当安全的 ; 然后在需要时修改列以允许NULL值.另一方面,如果您先允许NULL值,然后再决定不想允许它们,那么执行此操作可能要困难得多.
如果您过度地执行此操作,它可能会使您的数据库表/列描述非常难看,但如果有疑问,请继续并限制数据.
Erw*_*out 11
关系理论认为它NULL
是邪恶的.
但是,你的问题提到了实践.
所以,在某种程度上,你希望你的实践符合理论的天堂理想,是的,避免NULL
好像是瘟疫,霍乱和艾滋病一体化.
如果这些称为"SQL DBMS"的糟糕实现不会给你任何其他选择,是的,(嗅探)使用它们.
编辑
有人提到"业务规则"作为接受答案中"适当性"的指导原则,还有一些人赞成这一说法.那是完全废话.业务规则总是可以不用NULL
s而且"适当性"的唯一指导是任何SQL系统的缺陷,使得它成为非关系系统引导.
NULL引用(1965)的发明者最近将其称为"十亿美元的错误":http://qconlondon.com/london-2009/presentation/Null+References :+The+ Billion +Dollar+ Mistake
默认情况下,Scala,SML和Haskell等语言为非NULL:NULL称为"Option"或"Maybe",需要特殊的语法和检查.
由于时间数据库是发明的,因此默认允许NULL被认为越来越危险和不可取.数据库应该遵循?大概.
尽可能使用NOT NULL.
如果您在插入时无法知道值,则必须允许为null.例如,假设您有一个包含两个字段的记录,即开始日期和结束日期.您知道插入记录时的开始日期,但不知道结束日期.为了避免空值而创建一个假日期放在这个字段中是至少可以说是愚蠢的.
在现实生活中,至少同样多的伤害是由于强迫数据进入某个领域而造成的.如果您有一个电子邮件字段并且不知道客户的电子邮件,那么用户必须做出一些事情才能进入必填字段.可能他们所构成的可能不是你希望他们构成像"thisistupid@ass.com"这样的东西.有时,这些不良信息会被提供回客户端或数据源中的供应商,而您的公司看起来真的很愚蠢.我知道,当我处理来自客户的大量这些Feed时.电子邮件领域的好东西包括,"他的秘书是肥胖的金发女郎","这个家伙是一个混蛋"等.
我是一个新手,我的回答可能完全是愚蠢的,但这是我个人对这个主题的看法。
以我的拙见,我不认为允许除主键/外键之外的所有字段为可空的问题。我知道你们很多人一说这话就畏缩了,我敢肯定我听到有人喊道:“异教徒!烧死他!” 但这是我的推理:
强制执行关于哪些值应该和不应该被允许的规则真的是数据库的工作- 当然除了需要强制执行诸如参照完整性之类的事情和控制存储消耗(通过设置诸如 max chars 之类的东西)?在将值存储到数据库之前,在代码级别强制执行所有“空与非空”规则不是更容易更好吗?
毕竟,无论如何,在将所有值存储到数据库之前验证所有值是代码的工作,对吗?那么,为什么数据库还要通过设置有关哪些值有效的规则来试图篡夺代码的权限呢?(在某种程度上,除非绝对必要,否则使用非空约束几乎感觉就像违反了“关注点分离”的想法。)此外,任何时候在数据库级别强制执行约束时,都必须在代码中强制执行级别还可以防止代码“炸毁”。那么为什么要做两倍的工作呢?
至少对我来说,当我的数据库被允许只是一个“哑数据存储容器”时,事情似乎会更好,因为在过去,当我试图使用“NOT NULL”来强制执行一个业务规则时,当时对我来说,我最终希望我没有并最终返回并消除约束。
就像我说的,我意识到我是一个新手,如果有什么我忽略的地方,请告诉我 - 并尽量不要把我弄得太糟:) 谢谢。