2013-05-03 5 views
5

私はユーザーとそのアクセス許可のデータベースを持っています。ビットマスクと別の列

このような状況のためのより良い何
Name | sendMessages | receiveMessages | post | readPosts 
------------+--------------+-----------------+------+---------- 
Jeff Atwood |  1  |  1  | 0 |  1 

、(例のように)別の列または単一の列、ビットマスクを含む(この場合には、11010xDに変換):たとえば、行は次のようになりますか?

+5

クエリの目的では、間違いなく列を区切ります。ストレージスペースが実際の現実の問題でない限り、私はそのことに気づくでしょう –

+0

あなたがあなたのマスクの列に収まるよりも多くの特権を持っていると思うなら、事態は本当に醜いかもしれません。特権ごとに1つの列がある場合は、読みやすくすることもできます。私は間違いなく別々の列を持って行くだろう – nurdglaw

答えて

9

tinyint(1) booleanはusallyally go行く最良の方法です。あなたは

は、単純なクエリを見てみましょうインデックスを利用することを試みるならば、それはそれはそれを を計算する必要がある場合、インデックスを使用することはできませんか、非常に厄介な得ることができるようビットマスクを使用してクエリを行う

は効率的ではありません

select * from tbl where sendMessages = 1 and readPosts = 1 
なり、単一の列で

:それは全表スキャンや計算を行う必要がありますよう

select * from tbl where val&9 = 9 

は、これは本当に効率的ではありません。

インデックスを使用できるようにクエリを書き直してみます。 これはINで、すべての可能な値をリストすることによって行うことができます:あなたはまだでしょうあまりにも多くの値のMySQLのオプティマイザを一覧表示する場合

select * from tbl where val in (9, 11, 13, 15) 

は、このクエリを見て、あなたがwhere readPosts = 1

しかし、単純な行いたいならば想像フルテーブルスキャンを実行する

+4

直接問い合わせされない数百または数千のビットがある場合は、このルールの例外です。 – tadman

+1

ご意見ありがとうございます。常に例外があります。 n =数百または数千に必要な列数はいくつですか? n/64? –

+1

"ビット"あたり1つの列であれば、おそらくビット数と同じ数の列になります。あなたのスキーマはある時点で意味を持ちません。 – tadman

8

パーミッションにカラムを使用せず、パーミッションテーブルとユーザパーミッションリンクテーブルを作成するとどうなりますか?

+0

私は利点が表示されません。 –

+2

@Giulioこれは、データモデルを変更することなく、パーミッションの追加、変更、削除を可能にします。カラム名を変更する必要はなく、WHERE句に渡されるパラメータを変更することができる、より簡単なクエリが可能になります。そして、他にも数多くの正規化のメリットがあります。 – CodeCaster

+1

@GiulioMuscarello参照:http://stackoverflow.com/questions/9774715/mysql-multiple-tables-or-one-table-with-many-columns各メソッドには、プロとコンプがあります。権限/役割を使用すると、通常、正規化プラクティスを適用するのが安全です。ジョイン操作中に正規化されたレコードが40,000を超えると、クエリ時間が増加します。 – fyrye

0

ビットマスクを使用すると、最初または最後のビット0を使用することはできません(32ビットのベット/ 64ビットの63ビット)。pow(2ビット)& field = pow(2、ビット)あなたが複数のフィールドを使用して開始する必要があり、その後、あなたのビットがセットされ、フィールドワークアウトの痛みに取得、その後に対処することができる1つの以上のフィールドが必要な場合は

これを容易にすることができますあなたが探しているビットと問題のフィールドや行を指定すると、真偽を返す単純なルーチンで克服することができます。

しかし、@CodeCasterはパーミッションテーブルとリンクテーブルを使用しているので、パーミッションに関しては最高です。

1

BITデータ型を使用してアクセス許可を別々の列として保存することをお勧めします。最新のデータベースエンジンは、ビット列記憶域を最適化します。

  • テーブル内の最大8ビット列の列は1バイトで格納されます。 9用
  • と16ビットの列まで、カラムは2バイト、
  • に格納されているので、

上だから、あなたはリスト2つのオプションのほとんどになります。ビットマスキングによるストレージの削減、複数の列の明瞭性の維持エンジンがあなたのためにそれを処理します。

関連する問題