我的表中有大量的布尔字段,包含假日位置列表。由于ajax从浏览器中获取数据,并且我希望拥有大量移动用户,因此我将它们组合成整数以供按位运算符使用。因为虽然有很多字段(超过32个)但我必须对字段进行分组并为每个组生成一个整数。所以(在简化的伪代码中(我实际上使用的是php))
[ hasCar: 1, hasBoat: 0, hasTree: 0, hasCat: 1, hasHorse: 0]
将映射到类似
的内容[
things: int("100"),
animals: int("10")
]
我将这些整数存储在数据表的其他字段中。这个问题是它非常不灵活。例如如果我改变了对布尔字段进行分组的方法,或者删除了一个我必须重新生成所有整数并覆盖每个项目的数据。
有没有人对如何以高效,可维护的方式处理按位数据的生成有任何好的想法。
答案 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)
);
是的,它在空间上的效率不高 - 但它具有可扩展性,可用性和适应性。