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

标签 c# .net sql sql-server-2008 null

我的任务是重构 SQLServer 数据库....很多表和列“允许空值”,这是好习惯吗...

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

如果是这种情况,我有哪些替代方案?

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

我真的很感激任何人的意见。

我目前正在使用来 self 的数据库的模型(来自 Entity Framework )和“ALLOW NULLS”为空的数据库列......并且一些存储过程要求我有一个默认值......即BOOLEAN要求默认为 FALSE ... 但它为 null ...

好吧,我不想偏离我最初的问题,从我能收集到的信息来看,ALLOW NULL 是一件坏事......那么我该如何解决这个问题?

非常感谢任何帮助

最佳答案

毫无疑问,应该尽可能避免使用 NULL,因为它们可能会引入索引和查询语法方面的一些问题。

由于 NULL 可能带来的问题,有人呼吁停止使用它们。然而,像大多数这样的运动一样,它已经失控,以至于一些人狂热地坚持 NULL 永远不应该在数据库中使用。在我发现它有点过分热心之前,我在这个营地里待了很多年。

答案介于两者之间。应尽可能避免使用 NULL,但存储它们确实有正当的商业理由。

很多时候你需要存储一个可选的数值,很多人会告诉你只存储一个零来表示“没有值”,但这是一个更糟糕的反模式,存储一个真正意味着其他东西的神奇值。如果你不能对一个字段使用零怎么办,因为零也被认为是一个有意义的值,或者因为这个值被用作除数的倍数,所以你需要使用其他一些神奇的值(-1? ) 在这种情况下对于那个字段,现在你遇到了一个更糟糕的问题,因为你所有的可选数字字段现在的行为都不同了。哎呀。

日期是可空字段的更有吸引力的候选者。人们在 .NET 中使用的标准“无值”是默认的未分配 DateTime 值,即 DateTime.MinValue,或更具体地说是 0001 年 1 月 1 日。但是,您不能将此神奇值写入 SQL 数据库,因为默认的最小值是SQL Server DATETIME 字段是 1973 年 1 月 1 日。您现在必须有一些东西来检查您是否在将这些值写入数据库和从数据库中读取时正确地转换这些值,并且您必须在所有检查的地方都有防御性编码对于您的日期字段是否小于 SqlDateTime.MinValue,而不是仅仅检查它们是否等于 DateTime.MinValue。双眼。

我的偏好是按真实情况处理值,而不是构建大量人为构造来隐藏字段的真实含义和用法。如果某个字段很可能没有值,请将其设置为可为空,并在您的应用程序对象中也将其设置为可为空(如果您的语言支持此类操作)。然后,无论何时您使用该字段,您都需要考虑在它为 NULL 的情况下应该做什么,但这实际上是一件好事。一般来说,我反对让开发人员将脑力浪费在不必要的代码复杂性上,但那是因为它转移了人们对正在解决的真正业务问题的注意力;然而,在这种情况下,缺少值(value)是真正业务问题的一部分,必须仔细考虑。如果您只是默认这些值,那么编写公式或算法的开发人员将不太可能考虑这些值缺失的边缘条件,甚至可能当时没有意识到这些值可能缺失.

关于c# - .NET:在数据库字段中允许 NULLS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2636290/

相关文章:

sql - 如果根据 EXPLAIN QUERY PLAN 它应该是相反的,为什么一个 SQL 查询比另一个慢?

c# - 在AutoFac容器中针对 View 注册WPF ViewModel的最佳方法是什么?

c# - 使用 C# 从 Google Translation API 反序列化 JSON

c# - WPF MVVM : ItemTemplate for binding a list of ICommands to a ListBox

java - Android Palette 仅适用于某些 RecyclerView 项目

.net - 我可以从 FTP 服务器或 HTTP 服务器读取文件作为流吗?

mysql - 使用 MySQL,有什么方法可以转储数据库中所有 200 个表中每个表中的记录数?

.net - 为什么我无法查询其他用户的 2FA 注册详细信息?

c# - 统一容器 : Register two singletones which implement two interfaces one of which is common

mysql - MySQL 数据库中的多种关系