2011-05-09 4 views
1

休日の場所のリストを含むテーブルに多数のブール型フィールドがあります。データはブラウザからajaxで取得され、多くのモバイルユーザーがいることを期待しています。これらをビット単位の演算子で使用する整数に結合しました。しかし、私はフィールドをグループ化し、各グループの整数を生成しなければなりませんでした。だから私は私のデータテーブルに追加フィールドで、これらの整数を格納ビット単位のデータをよりメンテナンス可能にする

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

ような何かにマップされます

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

(単純化された擬似コードで(私は実際にPHP)を使用しています)。この問題は、非常に融通がきかないという問題があります。例えばブール値フィールドをどのようにグループ化するかを変更するか、1つを削除すると、すべての整数を再生成して各アイテムのデータを上書きする必要があります。

誰も効率的で維持可能な方法でビット単位のデータの生成を処理するための良いアイデアを持っていますか?

答えて

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を1つの整数 "transport"に入れたい場合は、 b)すべてのブール値フィールドが1ビットからもっと大きなサイズになるとデータベースサイズが大幅に増加します – wheresrhys

+0

すべての値を格納するために単一の列を使用できます。整数列は約20個の値に対応できる必要があります。値を合計して1つの列に入れるだけです。 – Tushar

0

これは、データベースの正規化に直面して飛びます。

確かにスペースを効率的に使用しますが、 'hasCat'を使ってすべてのレコードを照会する場合はどうすればよいですか? Tusharの列挙を使用し、SQLでブール値のarithを実行すると、すべてのクエリに対してフルテーブルスキャンを実行する必要があります。

は別々の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として - 使用可能と適応性が、そのスケーラブルな。

関連する問題