我们通常喜欢将所有我们的varchar / nvarchar列作为默认值使用空字符串(”)不可空.该团队中的一个人认为可空的更好是因为:
这样的查询:
Select * From MyTable Where MyColumn IS NOT NULL
比这更快:
Select * From MyTable Where MyColumn == ''
任何人都有经验来验证这是否是真的?
解决方法
在某些平台(甚至版本)上,这取决于索引的空值.
我的基本的经验法则是NULL:
>不要允许NULL,直到合理
>不要允许NULL,除非数据真的是未知的
一个很好的例子就是建模地址线.如果你有一个AddressLine1和AddressLine2,第一个有数据和第二个是NULL是什么意思?在我看来,你要么知道地址,要么在一组数据中存在部分NULL,所以当有人连接它们并获得NULL(ANSI行为)时,就会遇到麻烦.您可以通过允许NULL和添加检查约束来解决此问题 – 所有地址信息是NULL还是不存在.
与中间初始/名称相似的东西有些人没有人.这是不同于它是未知的,你在乎吗?
ALso,死亡日期 – NULL是什么意思?没死?未知的死亡日期?许多时候,单列不足以编码域中的知识.
所以对我来说,是否允许NULL将在很大程度上取决于数据的语义 – 性能将是第二,因为数据被误解(潜在地由许多不同的人)通常是一个比性能更昂贵的问题.
这似乎是一件小事(在sql Server中,该实现是与该行一起存储的位掩码),但只有允许在理由之后的NULL才能使我工作得最好.它在开发早期捕获事物,迫使您解决假设并了解您的问题领域.