8

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

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

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

4

5 回答 5

10

我只是尝试创建两个表,一个具有单个 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;

具有 30 位列的表的单行

位

具有一个 int 列的表的单行

INT

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

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

整数键

于 2010-07-30T18:25:37.680 回答
5

两者都不是——除非您有重大的空间问题或与其他系统的兼容性要求,请考虑这将如何阻止您优化查询并清楚地理解每个位代表什么。

一个表中可以有超过一千列,也可以有一个用于用户设置的子表。为什么将自己限制在需要在应用程序中解析的 30 位?想象一下,如果这些设置中的一些被弃用或引入了一些新设置,您需要对应用程序进行什么样的更改。

于 2010-07-30T17:47:16.977 回答
4

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

于 2010-07-30T17:47:11.647 回答
4

如果您组合成一个位标志字段,那么如果您正在查看原始数据,将很难看到设置了什么。我会为每个值使用单独的列,或者将选项存储在他们自己的表中。

于 2010-07-30T17:50:27.097 回答
1

我同意您的设计应该正确规范化,三个表用户和用户设置,以及一个桥接表:

用户:

用户名 int

用户名 varchar(X)

用户设置

设置id int

设置名称 varchar(X)

用户用户设置:

用户名 int

SettingId int

IsSet 位

桥表UserUserSettingUserSetting和 User 表之间会有 FK,并且在UserUserSetting中存在 t UserId、SettingId 的唯一控制约束

于 2010-07-31T03:57:43.320 回答