列が対応する自明なディメンション テーブルなどへ(fk_dim1value, fk_dim2value, ..., value)
の外部キーであるようなファクト テーブルを含むディメンション モデルを考えてみましょう。fk_X
dim1value (id, value), dim2value (id, value),
これらの事実と次元のテーブルは、さまざまなソースから自動的に収集されるため、多くのテーブルが存在します...そしてそれらは冗長です: すべての次元値テーブルは構造的に同一であり(id, value)
、それ以上のセマンティクスを持たないテキスト値の単純なコレクションを表します (唯一の違いは、さまざまなファクト テーブルでそれらを参照するさまざまな外部キーです)。あまり重要でないディメンション タイプは後で登場する可能性がありますが、さまざまなタイプのディメンションのセットは小さいままです。
dimvalue (fk_dim, dimvalue_id, value)
したがって、ディメンション テーブルを、 tableをfk_dim
参照する1 つのテーブルにマージし、各ディメンション内dimension (dim_id, name)
でdimvalue_id
のみ一意になるようにしたいと考えています。自然な主キーは複合です: (fk_dim, dimvalue_id)
.
ファクト テーブルの外部キー列はすべて同じテーブルを参照するようになりましdimvalue (fk_dim, dimvalue_id, value)
たが、もちろん、各列は特定のディメンションに関連付けられているため、そのディメンションの値を具体的に参照することに限定する必要があります (統合テーブルの水平パーティション)。dimvalue
)。
これを行う(賢明な)方法はありますか?
「半複合」外部キーのようなものを意味します。つまり、複合 PK の「スライス」への単一列参照であり、他の列には固定値があります。「完全複合」FK になりますFOREIGN KEY (col1, col2) REFERENCES dimvalue (fk_dim, dimvalue_id)
が、ここでは固定されているため、キーの「ホーム」側は 1 つの列にすぎず、主キーfk_dim
の 2 番目の列を参照します。dimvalue
のようなものFOREIGN KEY (fk_dim7value) REFERENCES dimvalue (fk_dim=7, dimvalue_id)
。
そのようなことは可能ですか?それとも、この最後の段落で道に迷っていますか? テーブル全体への外部キーだけをあきらめて、dimvalue
チェック制約を追加してディメンションで制限する必要がありますか? それとも、参照整合性のために、さらにあきらめて、別々の同一のテーブルをすべて受け入れる必要がありますか?
(書き込みパフォーマンスに対する制約の影響は重要ではありません。読み取りパフォーマンスは設計目標です。)