Sql server T-SQL/MS SQL中的Bool和可空Bool使用问题

Sql server T-SQL/MS SQL中的Bool和可空Bool使用问题,sql-server,database,tsql,nullable,non-nullable,Sql Server,Database,Tsql,Nullable,Non Nullable,我的团队有一个DB表,它在多个应用程序之间共享。该表有一个主键INT列,大多数列都是可为空的布尔值,用于标志和配置。请注意,并非所有应用程序都使用所有列,但某些列是共享的 表创建者提到,她选择采用这种方法,因为随着新需求的引入,表会不断增长。她也不希望数据库端决定默认值(因为引入的新列将被视为未知),而是让每个应用程序决定如何处理它所需的列上的空值。这种方法从来没有问题,因为表总是由主键查询的 但是,我们的新团队成员最近以局外人的视角查看了数据表,没有深入挖掘表的推理或上下文,并且担心由于潜在的

我的团队有一个DB表,它在多个应用程序之间共享。该表有一个主键INT列,大多数列都是可为空的布尔值,用于标志和配置。请注意,并非所有应用程序都使用所有列,但某些列是共享的

表创建者提到,她选择采用这种方法,因为随着新需求的引入,表会不断增长。她也不希望数据库端决定默认值(因为引入的新列将被视为未知),而是让每个应用程序决定如何处理它所需的列上的空值。这种方法从来没有问题,因为表总是由主键查询的

但是,我们的新团队成员最近以局外人的视角查看了数据表,没有深入挖掘表的推理或上下文,并且担心由于潜在的性能差而导致布尔值为空。他声称数据大小也将更大(在可预见的将来,表最多不会超过50k行),并建议列应该不可为null,并设置默认值

这种担心真的是这样吗?

(这太长了,不能作为评论) 正如有人所说,“空是邪恶的”。它继续说null就像一个医生,希望你不需要它,当你需要它的时候,你真的需要它。希望这表明“null”不是不经思考就应该使用的东西。至于性能,它不会有可忽略的影响,因为您所说的仅仅是50K行,这是一个非常小的数据集。如果您确信它不会在您的查询中造成任何问题,那么您可以让它们以这种方式存在,但请三思,您真的需要它们接受null吗?简单的默认值FALSE(0位)不就可以了吗?对于位数据类型,SQL server在内部将多个布尔字段打包为一个整数进行存储,比如说1位或8位字段占用相同的空间。

(这太长了,不能作为注释)
正如有人所说,“空是邪恶的”。它继续说null就像一个医生,希望你不需要它,当你需要它的时候,你真的需要它。希望这表明“null”不是不经思考就应该使用的东西。至于性能,它不会有可忽略的影响,因为您所说的仅仅是50K行,这是一个非常小的数据集。如果您确信它不会在您的查询中造成任何问题,那么您可以让它们以这种方式存在,但请三思,您真的需要它们接受null吗?简单的默认值FALSE(0位)不就可以了吗?对于位数据类型,SQL server在内部将多个布尔字段打包为一个整数进行存储,例如1位或8位字段占用相同的空间。

否,这些问题在一般情况下或在您的示例中无效。虽然应该避免空值,但是当一个值在逻辑上不应该为空时,应该避免空值;如果需要未知/未设置的值,则应采用该方法。可空位的大小和性能并不是一个真正的问题。仅供参考,这个问题几乎肯定会以基于意见的方式结束,它应该在软件工程网站上真正涵盖,而不是在有意义的地方使用一个可为空的bool。您需要认识到,从一个非空bool到一个可空bool可能会使编程变得复杂-您正在从2个状态(T/F)移动到3个状态(T/F/null)。您的所有程序现在都需要空感知。随着时间的推移,这些列没有默认值会令人沮丧,因为并非所有应用程序都将使用所有列。我appA想要插入一些东西,并且只使用了10个可能的列中的3个,然后它需要指定所有10个列,并为非空列提供一个合理的默认值。是的,5万行算不了什么不,这些担心在一般情况下或在您的示例中都是无效的。虽然应该避免空值,但是当一个值在逻辑上不应该为空时,应该避免空值;如果需要未知/未设置的值,则应采用该方法。可空位的大小和性能并不是一个真正的问题。仅供参考,这个问题几乎肯定会以基于意见的方式结束,它应该在软件工程网站上真正涵盖,而不是在有意义的地方使用一个可为空的bool。您需要认识到,从一个非空bool到一个可空bool可能会使编程变得复杂-您正在从2个状态(T/F)移动到3个状态(T/F/null)。您的所有程序现在都需要空感知。随着时间的推移,这些列没有默认值会令人沮丧,因为并非所有应用程序都将使用所有列。我appA想要插入一些东西,并且只使用了10个可能的列中的3个,然后它需要指定所有10个列,并为非空列提供一个合理的默认值。是的,5万行算不了什么