2011-05-09 63 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 - 但它的可擴展性,可用性和適應性。