短縮版
既存の多対多結合の各ペアに、一定数の追加プロパティを追加する必要があります。基本ケースを拡張してこれを達成するために、利点と欠点の観点から、オプション1〜4のどれが最良の方法であるかを下の図にスキップしますか?または、ここで検討していないより良い代替手段がありますか?
長いバージョン
現在、中間結合テーブルを介して、多対多の関係にある2つのテーブルがあります。既存のオブジェクトのペアに属するプロパティにリンクを追加する必要があります。プロパティテーブルの1つのエントリが複数のペアに適用される場合があります(または1つのペアに対して複数回使用される場合もあります)が、各ペアにはこれらのプロパティが固定されています。私はこれを行うための最良の方法を決定しようとしていますが、状況をどう考えるかを整理するのに苦労しています。意味的には、次のいずれかと同等にうまく説明できるようです。
- 固定数の追加プロパティの1つのセットにリンクされた1つのペア
- 多くの追加プロパティにリンクされた1つのペア
- 1つのプロパティセットにリンクされた多くの(2つの)オブジェクト
- 多くのプロパティにリンクされた多くのオブジェクト
例
XとYの2つのオブジェクトタイプがあり、それぞれに一意のIDがあり、リンクテーブルのobjx_objy
列x_id
とがありy_id
、これらが一緒にリンクの主キーを形成します。各Xは多くのYに関連付けることができ、その逆も可能です。これは、既存の多対多の関係のセットアップです。
規範事例
さらに、別のテーブルで定義された一連のプロパティと、特定の(X、Y)ペアがプロパティPを持つ必要がある一連の条件があります。条件の数は固定され、すべてのペアで同じです。基本的に、「状況C1では、ペア(X1、Y1)にプロパティP1があります」、「状況C2では、ペア(X1、Y1)にプロパティP2があります」など、結合の各ペアの3つのシチュエーション/条件についてテーブル。
オプション1
私の現在の状況であり、正確にこのような3つの条件があり、一つの可能性は、列を追加することですので、私は、それが増加することを期待する理由がないc1_p_id
、c2_p_id
とc3_p_id
にfeatx_featy
、与えられたために指定するx_id
とy_id
、どのプロパティp_id
3例ごとに使用します。
これは、SQLが機能に適用されるすべてのプロパティを選択するのを複雑にし、より多くの条件に容易にスケーリングできないため、私にとって素晴らしいアイデアのようには見えません。ただし、(X、Y)ペアごとに一定数の条件の要件を強制します。実際、それはここで唯一のオプションです。
オプション2
条件テーブルを作成し、条件テーブルcond
の主キーに条件IDを追加します。
これの1つの欠点は、各ペアの条件の数を指定しないことです。もう1つは、最初の関係だけを考えているとき、たとえば
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
次に、DISTINCT
エントリの重複を避けるために句を追加する必要があります。これは、各ペアが一度しか存在しないという事実を失ったようです。
オプション3
結合テーブルに新しい「ペアID」を作成し、最初のテーブルとプロパティと条件の間に2番目のリンクテーブルを作成します。
これには、各ペアに一定数の条件を強制しないこと以外に、最も不利な点があるようです。ただし、既存のIDのみを識別する新しいIDを作成することは理にかなっていますか?
オプション4(3b)
基本的にオプション3と同じですが、追加のIDフィールドは作成されません。これは、新しい結合テーブルに両方の元のIDを配置することで実現されるため、の代わりにx_id
とy_id
フィールドが含まれますxy_id
。
この形式のもう1つの利点は、既存のテーブルを変更しないことです(まだ運用されていません)。ただし、基本的にテーブル全体を複数回複製する(または、とにかくそのように感じる)ので、理想的とも思えません。
概要
私の感じでは、オプション3と4は十分に似ており、どちらでも使用できます。プロパティへの少数の固定数のリンクの要件がなければ、オプション1が他の場合よりも合理的に見えるようになるでしょう。いくつかの非常に限られたテストに基づいDISTINCT
て、クエリに句を追加してもこの状況でのパフォーマンスに影響はないようですが、オプション2が他の状況と同様に状況を表すかどうかはわかりません。リンクテーブルの複数の行の同じ(X、Y)ペア。
これらのオプションの1つが私の最善の方法ですか、または考慮すべき別の構造がありますか?
DISTINCT
句、私はリンク#2の端に1つ、のようなクエリを考えていたx
とy
経由xyc
を参照していないけどc
、私がしている場合...だから(x_id, y_id, c_id)
制約UNIQUE
行と(1,1,1)
し、(1,1,2)
その後、SELECT x.id, y.id FROM x JOIN xyc JOIN y
私は戻って、同一の2を取得します行、、(1,1)
および(1,1)
。