2012-02-15 12 views
0

私は多くの異なるフラグを持つ可能性のあるテーブルを持っています。これを処理する最善の方法は何ですか?多くの異なるデータベースフラグのスキーマを設計する方法

ここでのオプションは、私がメインテーブルに残っていくつかのフラグと

  1. 複数の多対多のテーブルを思い付いたです
  2. 1つの汎用多対多のテーブルと呼ばれるTableAttributesかであるフラグすべてのテーブルフラグに使用されます。ハンドリングのより多くのコードで、テーブル自体にフラグとして
  3. すべて(巨人のテーブルにつながる)

他のアイデアを残しています?

+0

個人的には、これらのフラグを必要とするテーブルの総数が少ない場合(10才未満の場合など)、オプション#1(メインテーブルに残っているフラグの* none *を除いて)に向いています。それ以上あれば、私はオプション#2に行くだろう。 – aroth

答えて

1

つの質問:

  • は所定のフラグていますか?
  • を検索する必要がありますか?

    enter image description here

    フラグは、対応する行がFLAGに存在するかどうかの指定のアイテムについて、「設定」である:フラグがない所定の、あなたはこのような何かをする必要がありますされていると仮定すると、

行がない場合は「リセット」します。 「NULL」と「リセット」を区別する必要がある場合は、FLAG_VALUEフィールドを追加できます。

この構造体は、以下の質問に効率的に答えます。「与えられたアイテムには、どのフラグがありますか?」。これが必要な場合は、セカンダリインデックスを避けてテーブルclustered(Oracleではインデックス構成)を作成することができます。

一方、(効率的に)質問に回答したい場合:「フラグを指定すると、どの項目が設定されていますか?」の場合は、{FLAG_NAME}にインデックスを追加するか、{FLAG_NAME, ITEM_ID}covering index(おそらくはあまり望ましくない)インデックスを追加する必要があります。


全てのフラグを予め決定されている場合、単に別の列として各フラグを表します。検索する必要があるものを索引します。データベースでサポートされている場合はビットマップ索引を使用し、変更のパフォーマンス要件では索引を使用できます。

ビットマップを使用すると、ブール値を効率的に表現できないデータベース(Oracleなど)でフラグをより緊密にパックし、潜在的にfunction-based indexesを使用できます。

1

私が過去に使用したアプローチは、ビットマップを活用することです。これらは単純なIntegerまたはBig Integerカラムとしてテーブルにモデル化できます。その後、データベースモデルを変更することなく、コードを使用してフラグを変更して適用する柔軟性が得られます。

は、例えば、2つの値の単純な力は、あなたのフラグである:すべての5つのフラグがアクティブである場合に1、2、4、8、及び16

select 1 | 2 | 4 | 8 | 16 
Result: 31 

あなたフラグ欄は、単に値31を格納することになります。フラグが有効であるかどうかを確認することができます。

この場合、ビット4のフラグがアクティブであることがわかります。 SQLコードでビットマップを使って作業するのは簡単です。もちろん、ビット単位の計算が言語の不可欠な部分であるクライアントアプリケーションでも使用できます。ビットマップは列挙してエンコードすることができ、定数付きクライアントコードとストアプロシージャで簡単に参照できます。

+0

私はこのアプローチを見てきました。私が気に入らないのは、ビット単位のスタイルクエリを実行せずにテーブル内のデータを見つけることが難しいことです。 – chobo

+0

@choboテーブルをオーバーレイするのは非常に簡単ですこれはビットマップを列に正規化しますが、作成したDBA以外にも生のテーブル・データを調べている人はほとんどいません。 – tawman

関連する問題