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位列的表的单行
带有一个int列的表的单行
从存储的角度来看,SQL Server结合了位列,并且数据存储在完全相同的空间量(黄色)中.你最终会为NULL位图(紫色)连续丢失3个字节,尽管这个长度与列数成正比(不论它们是否允许空值)
字段的键(对于int版本,颜色编码与位版本相同)
两者都没有 - 除非您对其他系统存在重大空间问题或兼容性要求,请考虑这将如何阻止您优化查询并清楚地了解每个位代表的内容.
表中可以包含超过一千列,也可以使用子表进行用户设置.为什么要将自己限制在需要在应用程序中解析的30位?想象一下,如果不推荐使用其中一些设置或引入了几个新设置,您需要对应用程序进行哪些更改.
我认为如果每个值都有列,那么将来的扩展会更容易。如果您将来添加另一个选项(对于大多数这样的应用程序来说可能是这样),那么它可能会影响您的所有其他代码,因为您需要重新解析 int 列以考虑新位。
归档时间: |
|
查看次数: |
1492 次 |
最近记录: |