使按位数据更易于维护

时间:2011-05-09 09:35:01

标签: php database performance bit-manipulation

我的表中有大量的布尔字段,包含假日位置列表。由于ajax从浏览器中获取数据,并且我希望拥有大量移动用户,因此我将它们组合成整数以供按位运算符使用。因为虽然有很多字段(超过32个)但我必须对字段进行分组并为每个组生成一个整数。所以(在简化的伪代码中(我实际上使用的是php))

[ hasCar: 1, hasBoat: 0, hasTree: 0, hasCat: 1, hasHorse: 0]

将映射到类似

的内容
[
   things: int("100"),
   animals: int("10")
]

我将这些整数存储在数据表的其他字段中。这个问题是它非常不灵活。例如如果我改变了对布尔字段进行分组的方法,或者删除了一个我必须重新生成所有整数并覆盖每个项目的数据。

有没有人对如何以高效,可维护的方式处理按位数据的生成有任何好的想法。

2 个答案:

答案 0 :(得分:0)

为了有效地使用Bitwise运算符,分配从2 ^ 0,2 ^ 1,2 ^ 2开始的值,即... 1,2,4,8,16,... 现在,当您将这些值存储在db中时,可以将这些值相加并存储在列中。

所以,例如如果你有这些价值观 [ hasCar: 1, hasBoat: 2, hasTree: 4, hasCat: 8, hasHorse: 16] 并且想要查询用户是否拥有树,您可以使用以下查询:

SELECT * from TABLE WHERE Col & 4 = 4 

答案 1 :(得分:0)

这与数据库规范化有关。

确保它有效地利用了空间,但是如果你想用'hasCat'查询所有记录呢?使用Tushar的枚举,并在SQL中执行布尔算法,您必须为每个查询运行全表扫描。

设置一个单独的2个表:

CREATE TABLE thingType (
  id INTEGER AUTOINCREMENT,
  description varchar(20),
  PRIMARY KEY (id) UNIQUE KEY lookup (description)
);
CREATE TABLE hasThing (
  thing_id INTEGER, locn_id INTEGER
  PRIMARY_KEY (locn_id, thing_id)
);

是的,它在空间上的效率不高 - 但它具有可扩展性,可用性和适应性。