在数据库中存储多选值的任何好方法?

时间:2010-07-20 01:09:57

标签: database selection

我目前所知道的是使用bitwise和Int类型在Database中存储多个选择值。

以Sql Server 2008为例,sql server中的'Int'类型是32bit,所以它接受32个答案,我只能用1,2,4,8,16等代表答案,由于我需要将多个选择存储到一个值中,并使用按位运算将它们分开。

Int:-2 ^ 31(-2,147,483,648)至2 ^ 31-1(2,147,483,647) BigInt:-2 ^ 63(-9,223,372,036,854,775,808)至2 ^ 63-1(9,223,372,036,854,775,807)

没有母校Int或BigInt,答案的数量是有限制的(32或64或128)。

还有其他方法可以解决这种情况吗?

非常感谢。

3 个答案:

答案 0 :(得分:2)

使用SQL Server中的bit data type存储它们可能要容易得多。 MSSQL会将多个位列压缩为最多包含8位的字节。例如,如果您有9位列,则总共占用2个字节。

但是如果你有非常多的位,那么它只会导致糟糕的数据库设计将它们分成不同的列,在这种情况下你可以使用一个固定长度的二进制数据类型,你可以访问它.NET或VB中的字节数组。

答案 1 :(得分:0)

使用Josh建议的位字段可以工作,但理论上你仍然可以达到列限制。

另一种方法是拥有一个单独的表,每个答案组合都有一行。每行包含一个唯一的ID,varchar列包含一个答案列表,使用您需要的任何方法来识别它们 - 例如以逗号分隔的答案ID列表。

插入/更新主表时,首先在答案表中查找与选择匹配的行。如果发现您有ID,则插入新组合并获取新ID。将ID存储在主表中。

答案 2 :(得分:0)

我建议您进行更多的潜在选择,然后使用外键创建一个单独的表回原始表。

e.g。

Customer

customer_id    customer_name
-----------    -------------
          1             Fred
          2           Barney

Customer_Options

  option_id   customer_id    option_value
  ---------   -----------    ------------
          1             1               1
          2             1               1
          1             2               0
          2             2               1

option_value的类型有点但可能是varchar或您需要的任何内容。 通过这种方式,可以在不进行大量模式更改的情况下增加可选选项。