在表中存储大量布尔列的最佳方法

时间:2009-07-06 10:02:13

标签: sql-server database-design

我不确定之前是否曾询问过这类问题,但我搜索过并找不到任何问题。

我正在研究一个数据库,其中包含大量基于布尔值的记录,因此表结构如下所示:

===Table===
ID <- int
Name <- string
Bool1 <- bool
Bool2 <- bool
Bool3 <- bool
Bool4 <- bool
Bool5 <- bool
Bool6 <- bool
Bool7 <- bool
Bool8 <- bool
Bool9 <- bool

并非所有布尔值都设置为一次,因此每条记录可以选择一个,多个或没有。

我考虑过做这样的事情:

==Main Table==     ===Second Table====
ID <- int PK          ValueID <- PK links to Main Table ValueID
Name <- string        ID <- int
ValueID <- FK         Value <- Contains name of assigned value eg Bool1, Bool2

因此,主表和第二表之间存在一对多关系,并且在ValueID上加入。因此第二个表只包含所选项的数据,而不是主表中的一组空布尔值。

我想这样做的原因是它允许我在将来添加不同的值以存储在记录中,而不是改变表结构。

这是存储大量布尔值的好方法吗?

我真的希望能够将其绑定到带有复选框的表单 会这样做会很难。

因此,如果我有点难以理解我的需要,我真的不知道如何在文本中解释它。

感谢。

3 个答案:

答案 0 :(得分:14)

保持原样!

数据库将非常有效地打包多个位字段。我见过人们做的事情就像拥有一个32位的int字段,因此允许他们使用bitmasking存储他们的17个布尔值,并“为其他字段留出一些空间”。这只是愚蠢的,这是一个维护噩梦,你的查询充斥着bitmasks使他们难以维护。

我将重申,保持简单,只需要布尔列。如果您需要新列,请添加它。您无需创建单独的表。

答案 1 :(得分:0)

如果您希望主记录的布尔数量发生变化,我建议您将其分为两个表格。

不要将FK(ValueID)放入主表,而是将MainID放入第二个表中。

您的问题中不清楚的一些事情:如果未设置值,这是否等于false值,或者您是否具有空值的三元逻辑?如果是后者,则必须在第二个表中放置一个布尔字段。否则,第二个表中缺少记录就足以使逻辑错误。

如果布尔属性的数量没有改变,你可以把它们放到一个整数字段中,并像Mike Chaliy建议的那样掩盖它们。

答案 2 :(得分:-1)

只是一个想法,你可以使用int来存储位,按位操作是有效的,但是我不确定SQL如何支持它们。在C#中有Bit Enums,因此您可以直接保存其值。