Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 空值应该在代码中处理还是在数据库中处理?利与弊?_C#_Sql Server_Tsql_Database Design - Fatal编程技术网

C# 空值应该在代码中处理还是在数据库中处理?利与弊?

C# 空值应该在代码中处理还是在数据库中处理?利与弊?,c#,sql-server,tsql,database-design,C#,Sql Server,Tsql,Database Design,关于在哪里处理空值,我有几个问题。让我来设定一个场景。假设我有一个表,其中有5个varchar(50)列,在提供使用null或空字符串的原因时用作示例 在代码中还是在数据库中处理空值更好?我的意思是,如果varchar(50)不包含值,那么最好将空字符串分配给它,还是将null分配给varchar(50)并在代码中处理该null 将空字符串分配给列是否会影响性能开销 使用空字符串与空字符串如何影响索引 我的印象是,如果不允许数据库包含null,则不必在代码中处理它。这句话是真的吗 在使用默认值时

关于在哪里处理空值,我有几个问题。让我来设定一个场景。假设我有一个表,其中有5个varchar(50)列,在提供使用null或空字符串的原因时用作示例

  • 在代码中还是在数据库中处理空值更好?我的意思是,如果varchar(50)不包含值,那么最好将空字符串分配给它,还是将null分配给varchar(50)并在代码中处理该null

  • 将空字符串分配给列是否会影响性能开销

  • 使用空字符串与空字符串如何影响索引

  • 我的印象是,如果不允许数据库包含null,则不必在代码中处理它。这句话是真的吗

  • 在使用默认值时,除了varchar之外的其他数据类型是否会造成相同的问题,或者字符串数据类型的问题更大

  • 如果表包含空值,则使用ISNULL函数的开销是多少

  • 还有哪些优点/缺点


  • 主要的优点是,您可以在.NET和SQL代码中分别处理空字符串和空字符串,毕竟它们的含义不同

    缺点是你需要小心;在.NET中,您不必对null调用obj.SomeMethod(),而在SQL中,您需要注意null在组合时会传播(例如,与C#字符串连接不同)


    空和空之间实际上没有明显的大小差异。在.NET代码中,我希望它使用插入的空字符串,但这并不重要。

    我认为空值和空字符串在代码和数据库中是两种不同的东西。变量或字段为null表示它没有值,但如果其中一个为空字符串,它确实有一个值恰好是空字符串。

    我的一般建议是将数据库中的字段声明为
    非空
    ,除非您特别需要允许
    值,因为对数据库新手来说,它们往往很难处理

    请注意,空字符串和空字符串字段不一定意味着相同的内容(除非您将它们定义为)。通常null表示“未知”或“未提供”,而空字符串就是提供的和已知的空字符串


    允许或不允许
    null
    字段完全取决于您的需要。

    null的存储效率(null位映射)高于空字符串(varchar长度为2字节,char长度为“n”)


    我看过一些文章说的不同,但是对于char/varchar,我发现NULL非常有用,并且倾向于将空字符串视为NULL。我还发现NULL在查询中也比空字符串快。当然,YMMV,我将根据每个案例的优点进行评估。

    1:非常主观,正如其他答案所指出的,NULL(无答案/未知)和“”(已知为无/不适用-即没有中间名的人)之间有明显的区别

    2:不应该

    3:AFAIK(我还是一名初级/学习型DBA,所以对此持保留态度),但应该没有效果


    4:这是有争议的。理论上,如果对数据库字段应用NOTNULL约束,则永远不必处理NULL值。在实践中,理论与实践之间的差距在理论上小于在实践中。(换句话说,即使理论上不可能,您也应该处理被赋予NULL的问题。)

    您将实现问题与逻辑数据架构问题混为一谈

    您应该完全根据字段是否准确地建模了希望存储在数据库中的数据来决定是否允许在字段中使用null。正如其他一些人指出的那样,部分混淆在于空字符串和空字符串不仅仅是存储相同信息的两种方式

    Null表示没有值或值未知。
    空字符串表示存在一个值,它是一个空字符串

    让我举个例子来说明。例如,假设您有一个中间名字段,需要区分中间名未填充的情况和此人没有中间名的情况。使用空字符串表示没有中间名,null表示未输入中间名

    在几乎所有情况下,如果null在数据方面有意义,则应在应用程序代码中处理它们,而不是在数据库中处理,前提是数据库需要区分两种不同的状态


    简短版本:不要基于数据库中的性能/存储问题选择空字符串与空字符串,选择对您试图存储的信息进行最佳建模的一个。

    在设计过程中,我通常默认为
    不为空
    ,除非给出其他原因-尤其是会计中的货币/小数列-通常情况下,这些都不是未知的方面。可能有这样一种情况,货币栏是可选的(例如,调查或业务关系系统,您将家庭/业务收入放在其中-在客户经理建立关系之前/如果客户经理建立了关系,则可能不知道这一点)。例如,对于datetime,我从不允许使用
    NULL
    RecordCreated列,而生日列则允许使用
    NULL

    NOT NULL
    列删除了大量潜在的额外代码,并确保用户不必对
    NULL
    s进行特殊处理,尤其适用于表示层视图或用于报告的数据字典

    我认为在设计阶段,花大量时间处理数据类型(char与varchar、nchar与nvarchar、money与decimal、int与varchar、GUID与identity)、NULL/notnull和primary非常重要