2011-01-16 11 views
4

私のアプリケーションでは、ユーザに勤務日を選択させたいと思います。それらをデータベースに格納します。もちろん、私のアプリケーションは以下のようにユーザーのデータを処理します:今日は特定のユーザーのための働く日、今日働くべきユーザー、...などDBにフラグを格納する

私の質問は、これをする?私が使用する必要があります。

  1. は日、ユーザーとdays_users用のテーブルを作成することによって、多くの関係テーブルへ
  2. 多くのユーザーテーブル内のフィールドをBitmasking。 ありがとうございます。
+0

これは非常に主観的です。あなたとあなたの家は明確さや最適化の傾向がありますか?また、それらのいずれかがここでも重要な要素であるかどうかは、環境に大きく依存します。 –

答えて

7

私は、ビットマスクフィールドはリレーショナルアンチパターンであると言います。

フィールドは単なる意味のある値でなければなりません。それ以外の場合は、クエリの問題が発生します。フィールドを使用するたびにフィールドを解析する必要があります。

このようなフィールドには、自己が記述していない値が格納されているため、余分なドキュメントも必要です。

+0

Ling2Sqlと 'Flags' enumマッピングでうまく動作しますが、ユーザーが複数のロールを持ち、3番目のテーブルが不要な' User'と 'Role'テーブルがあります。確かに、これは表面上ではデータ/ロジックの信頼を意味するが、今日の言語/プラットフォームの移転可能な機能は与えられていない。 –

+0

@失望 - 私は多対多のテーブルアプローチの説明が好きです。ビットフィールドには余分なドキュメントが必要です(記述した通りに使用されていない限り)。 – Oded

+0

私は同意する傾向があります。 –

2

ビットマスクフィールドは本質的に少し秘密で、ビットマスクに格納する内容を解釈するために何か他のものを作成する必要があります。

第2のアプローチは、はるかに透過的でわかりやすく、さらに値を追加する必要がある場合はさらに柔軟性があります。ビットマスクを使用すると、リレーショナルアプローチと比較してメンテナンスの悪夢となる値を追加するたびに、ビットマップデコーダをやり直す必要があります。

2

私はオプション1に間違いを犯しました。時間を追って帰る機会を与えられれば、私はそれを絶対に他のやり方にするでしょう。

あなたのデータベースは、あなたのビットマスクでビット単位のクエリを作成するためにインデックスを使用することはほとんどありません。だから火曜日に働いているすべての人を見つけたいなら、毎回インデックススキャンをするつもりです。テーブルが大きくなると、パフォーマンスが低下する可能性があります。 SELECT DISTINCT(bitmaskfield)を事前にキャッシングし、自分のアプリケーションでビットマスクロジックを実行し、それを適切なWHERE bitmaskfield IN (...)句にチューリングすることで最適化を試みることはできますが、それはすぐに別のビットマスクキャッシュを更新する必要があるため、データベース内の値を変更するすべての場所。

追加のテーブルと結合が痛みのように見えるかもしれませんが、ビットマスクが悪化します。これを信じてください。データベースをデータベースとして使用する。

関連する問題