存储多个位 - 我应该使用多列还是单个位域列?

Ear*_*rlz 8 sql database-design sql-server-2005 sql-server-2008 bit-fields

我正在User我的数据库中设计一个表.对于每个用户,我有大约30个左右的选项,可以是"允许"或"禁止".

我的问题是我应该将这些bit列存储为30 列,还是应该使用单列int来存储它们并解析我的应用程序中的每一位?

此外,我们的数据库是SQL Server 2008和2005(取决于环境)

Mar*_*ith 11

我只是尝试创建两个表,一个包含一个int列,另一个包含30位列,然后为每个表添加一行,并使用SQL Server Internals Viewer查看它们

CREATE TABLE T_INT(X INT DEFAULT 1073741823);

CREATE TABLE T_BIT(
X1  BIT DEFAULT 1,
/*Other columns omitted for brevity*/
X30 BIT DEFAULT 1
);

INSERT INTO T_INT DEFAULT VALUES;

INSERT INTO T_BIT DEFAULT VALUES;
Run Code Online (Sandbox Code Playgroud)

具有30位列的表的单行

BITS

带有一个int列的表的单行

INT

从存储的角度来看,SQL Server结合了位列,并且数据存储在完全相同的空间量(黄色)中.你最终会为NULL位图(紫色)连续丢失3个字节,尽管这个长度与列数成正比(不论它们是否允许空值)

字段的键(对于int版本,颜色编码与位版本相同)

Int键


Cah*_*hit 5

两者都没有 - 除非您对其他系统存在重大空间问题或兼容性要求,请考虑这将如何阻止您优化查询并清楚地了解每个位代表的内容.

表中可以包含超过一千列,也可以使用子表进行用户设置.为什么要将自己限制在需要在应用程序中解析的30位?想象一下,如果不推荐使用其中一些设置或引入了几个新设置,您需要对应用程序进行哪些更改.


JNK*_*JNK 4

我认为如果每个值都有列,那么将来的扩展会更容易。如果您将来添加另一个选项(对于大多数这样的应用程序来说可能是这样),那么它可能会影响您的所有其他代码,因为您需要重新解析 int 列以考虑新位。