我不确定之前是否曾询问过这类问题,但我搜索过并找不到任何问题。
我正在研究一个数据库,其中包含大量基于布尔值的记录,因此表结构如下所示:
===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上加入。因此第二个表只包含所选项的数据,而不是主表中的一组空布尔值。
我想这样做的原因是它允许我在将来添加不同的值以存储在记录中,而不是改变表结构。
这是存储大量布尔值的好方法吗?
我真的希望能够将其绑定到带有复选框的表单 会这样做会很难。
因此,如果我有点难以理解我的需要,我真的不知道如何在文本中解释它。
感谢。
答案 0 :(得分:14)
保持原样!
数据库将非常有效地打包多个位字段。我见过人们做的事情就像拥有一个32位的int字段,因此允许他们使用bitmasking存储他们的17个布尔值,并“为其他字段留出一些空间”。这只是愚蠢的,这是一个维护噩梦,你的查询充斥着bitmasks使他们难以维护。
我将重申,保持简单,只需要布尔列。如果您需要新列,请添加它。您无需创建单独的表。
答案 1 :(得分:0)
如果您希望主记录的布尔数量发生变化,我建议您将其分为两个表格。
不要将FK(ValueID)放入主表,而是将MainID放入第二个表中。
您的问题中不清楚的一些事情:如果未设置值,这是否等于false值,或者您是否具有空值的三元逻辑?如果是后者,则必须在第二个表中放置一个布尔字段。否则,第二个表中缺少记录就足以使逻辑错误。
如果布尔属性的数量没有改变,你可以把它们放到一个整数字段中,并像Mike Chaliy建议的那样掩盖它们。
答案 2 :(得分:-1)
只是一个想法,你可以使用int来存储位,按位操作是有效的,但是我不确定SQL如何支持它们。在C#中有Bit Enums,因此您可以直接保存其值。