.NET:在数据库字段中允许NULLS?

mar*_*ith 5 .net c# sql null sql-server-2008

我的任务是重新分解SQLServer数据库....很多表和列"允许NULLS",这是一个很好的做法......

我似乎记得CSLA.NET的创作时说在数据库中允许空值是非常糟糕的做法...

如果是这种情况,我的替代方案是什么?

从所有列中删除所有"ALLOW NULLS"....在数字列中使用值-1例如??

我真的很感激任何人的任何输入.

我目前正在使用我的数据库中的模型(来自实体框架)和"允许NULLS"的数据库列为空...并且一些存储过程要求我有一个默认值...即BOOLEAN需要FALSE作为默认值...但它是空的..

好吧,我不想偏离我原来的问题,允许NULLS是我可以收集的一件坏事....所以我该如何解决这个问题?

任何帮助真的很感激

Mik*_*ney 8

毫无疑问,在可能的情况下应该避免使用NULL,因为它们可能会引入索引和查询语法的几个问题.

由于NULL可能引入的问题,一直停止使用它们.然而,像大多数这样的动作一样,它已经失去控制,以至于有些人狂热地坚持不应该在数据库中使用NULL.我在这个营地待了很多年,才发现它有点过分热情.

答案介于两者之间.应尽可能避免使用NULL,但存储确实存在有效的商业原因.

通常你需要存储一个可选的数值,很多人会告诉你只存储一个零来表示"没有价值",但这是一个更糟糕的反模式,它存储了一个神奇的价值,这真的意味着别的东西.如果你不能对一个字段使用零,那么因为零被认为是一个有意义的值,或者因为这个值被用作除数的倍数,所以你需要使用一些其他的神奇值(-1? )对于这种情况下的那个字段,现在你有一个更糟糕的问题,因为所有可选的数字字段现在表现不同.奥耶.

日期是可空领域的一个更引人注目的候选者.人们在.NET中使用的标准"无值"是默认的未分配DateTime值,即DateTime.MinValue,或更具体地说是0001年1月1日.但是,您无法将此魔术值写入SQL数据库,因为默认的最小值为SQL Server DATETIME字段是1973年1月1日.您现在必须要有一些东西可以检查您在写入和读取数据库时是否正确地翻译这些值,并且您必须在检查的地方进行防御性编码您的日期字段是否小于SqlDateTime.MinValue,只是检查它们是否等于DateTime.MinValue.双Oye.

我倾向于处理它们真实存在的价值,而不是建立许多人工构造来隐藏该领域的真正含义和用法.如果某个字段很可能没有值,则使其可为空,并使其在应用程序对象中也可以为空(如果您的语言支持这样的事情).然后,无论何时使用该字段,都需要考虑在它为NULL的情况下应该做什么,但这实际上是一件好事.一般来说,我反对让开发人员在不必要的代码复杂性上浪费大脑,但这是因为它将重点放在正在解决的真正业务问题上; 但是,在这种情况下,缺乏价值是真正的商业问题的一部分,必须加以考虑.如果您只是默认这些值,那么编写公式或算法的开发人员将不太可能考虑缺少值的边缘条件,并且可能甚至没有意识到这些值可能会丢失.


ame*_*vin 1

有时 Null 是有效的列值,但我建议更好的做法是添加默认值并使列不为 Null。

如果您需要考虑现有数据,则必须进行如下更新:

update TableA set ColumnA = 'default value' where ColumnA is null 
Run Code Online (Sandbox Code Playgroud)

...如果您想对现有数据强加“not null”。

如果没有合理的默认值,那么 null 可以是一个完全有效的列值 - 但通常有一个不错的默认值可用。