如何在MySql数据库中存储布尔值数组?

时间:2010-07-01 03:52:11

标签: mysql database-design arrays boolean field

在我的情况下,每个“项目”都有一个属性,或者没有。属性可以是几百个,所以我需要每个项目最多1000个真/假比特。

有没有办法将这些位存储在项目的一个字段中?

4 个答案:

答案 0 :(得分:3)

我宁愿选择以下内容:

Properties
ID, Property
1, FirsProperty
2, SecondProperty

ItemProperties
ID, Property, Item
1021, 1, 10
1022, 2, 10

然后,通过查询任何特定项目,可以轻松检索设置或未设置的属性。

答案 1 :(得分:3)

如果您正在寻找一种以可搜索的方式执行此操作的方法,那么不会。

一些可搜索的方法(涉及多于1列和/或表):

  • 使用一堆SET列。在一组中你只能限制64件物品(开/关),但你可能想出一种方法来对它们进行分组。
  • 使用3个表:Items(id,...),FlagNames(id,name)和数据透视表ItemFlags(item_id,flag_id)。然后,您可以使用joins查询项目。

如果您不需要它可搜索,那么您需要的是在将数据放入数据库之前序列化数据的方法,并在将其拉出时对其进行反序列化,然后使用char或varchar列。

  • 使用您的语言内置的工具(PHP的序列化/反序列化)。
  • 将一系列“y”和“n”字符连接在一起。
  • 在调用MySQL数据库之前,将您的值打包到客户端中的字符串(每个字符8位),并在从数据库中检索数据时将其解压缩。这是最有效的存储机制(如果所有行都相同,则使用char [x],而不是varchar [x]),代价是数据不可搜索且代码稍微复杂。

答案 2 :(得分:0)

最糟糕的是你必须使用char(1000)[ynnynynnynynnynny ...]等。如果你愿意打包它(例如,十六进制也不是太糟糕)你可以使用char(64)[十六进制字符]来完成它。

如果它小于64,那么SET类型将起作用,但似乎这还不够。

你可以使用二进制类型,但这是为电影等东西设计的。所以我不会。

所以是的,似乎你最好的选择是将它打包成一个字符串,然后存储它。

应该注意的是,VARCHAR会浪费空间,因为您确实知道数据将占用多少空间,并且可以精确地分配它。 (有固定宽度的行是一件好事)

答案 3 :(得分:0)

严格来说,您可以使用以下方法完成此任务:

$bools = array(0,1,1,0,1,0,0,1);
$for_db = serialize($array);

// Insert the serialized $for_db string into the database. You could use a text type
// make certain it could hold the entire string.
// To get it back out:

$bools = unserialize($from_db);

尽管如此,我强烈建议您考虑其他解决方案。

根据用例,您可能会尝试创建一个“item”表,该表与“attributes”表中的值具有多对多关系。这将是公共实体属性值数据库设计模式的标准实现,用于存储关于公共对象集的数据的可变点。