通常,我们希望所有varchar/nvarchar列都 不能为空, 并使用空字符串(’‘)作为默认值。团队中的某人建议 nullable 更好,因为:
varchar
nvarchar
这样的查询:
Select * From MyTable Where MyColumn IS NOT NULL
比这更快:
Select * From MyTable Where MyColumn == ''
任何人都具有验证这种说法是否正确的经验吗?
在某些平台(甚至版本)上,这将取决于对NULL进行索引的方式。
我对NULL的基本经验法则是:
除非有正当理由,否则不允许NULL
除非数据确实未知,否则不允许NULL
一个很好的例子是对地址线进行建模。如果您有一个AddressLine1和AddressLine2,那么第一个具有数据,第二个为NULL意味着什么?在我看来,您要么知道地址,要么不知道地址,并且在数据集中有部分NULL的情况只是在有人将它们串联并获得NULL时才提出麻烦(ANSI行为)。您可以通过允许NULL并添加检查约束来解决此问题- 所有地址信息都为NULL或全都不为。
中间名字首字母/名称类似。有些人没有。这与未知是不同的吗?您在乎吗?
另外,死亡日期-NULL是什么意思?没死?未知的死亡日期?很多时候,单列不足以对领域中的知识进行编码。
因此对我来说,是否允许NULL很大程度上取决于数据的 语义 -性能将排在第二位,因为错误地解释数据(可能被许多不同的人)通常比性能昂贵得多。
看起来似乎有点小事(在SQL Server中,实现是与行一起存储的位掩码),但在我看来,只允许在对齐后使用NULL似乎效果最好。它在开发的早期就抓住了问题,迫使您应对假设并了解您的问题领域。