2011-05-09 61 views
1

我的表中有大量的布尔字段,其中包含假日位置列表。由于数据是由ajax从浏览器中提取的,我希望有很多移动用户,所以我将它们合并为一些整数,供按位运算符使用。因为有很多字段(超过32个),所以我不得不对这些字段进行分组,并为每个分组生成一个整数。所以(在简化的伪代码(我实际使用PHP))使按位数据更易于维护

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

将映射到像

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

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

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

回答

0

对于使用有效位运算符,分配从2^0,2^1,2^2,...即1,2,4,8,16 ...
开始的值现在当你以db为单位存储这些值,这些值可以总结并存储在一列中。

因此,例如,如果你有这些值 [ hasCar: 1, hasBoat: 2, hasTree: 4, hasCat: 8, hasHorse: 16] ,想要查询,如果用户hasTree,可以使用下面的查询:

SELECT * from TABLE WHERE Col & 4 = 4 
+0

不错的主意......但a)当我想重新组合字段时(例如,如果我想将hasBoat,hasCar,hasHorse放入一个整数“transport”中,我仍然需要做很多事情重写值的工作; b)如果我的所有布尔字段从1位变为更大的大小,它会大大增加数据库的大小。 – wheresrhys 2011-05-09 13:32:09

+0

您可以使用单列来存储所有值。整数列应该能够容纳大约20个值。你只需要总结这些值并将它们放在一个列中。 – Tushar 2011-05-10 03:00:56

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) 
); 

是,它几乎没有空间effieicent - 但它的可扩展性,可用性和适应性。