Peter Wone の発言に加えて、JOIN の両方の「方向」を最適に実行するためにデータベースに存在する「理想的な」ジャンクション テーブル構造を次に示します。
- 2 つの FK の組み合わせである複合 PK を持っています。
- PK の正確な「逆」である代替インデックスがあります。
- リーディング エッジ フィールドの繰り返しによるオーバーヘッドを最小限に抑えるために、両方のインデックス (プライマリと代替) が圧縮されます。
- 代理キーはありません (したがって、3 番目のインデックスは必要ありません)。
- クラスター化されています。代替インデックスにはすでにすべての PK フィールドが含まれているため (逆の順序で)、クラスター化されたテーブルの代替インデックスに通常関連するオーバーヘッドはありません。また、JOIN をカバーするため、二重ルックアップはありません。
そのための Oracle 構文は次のようになります。
CREATE TABLE LINK_MODEL (
MODEL_A_ID INT,
MODEL_B_ID INT,
PRIMARY KEY (MODEL_A_ID, MODEL_B_ID),
FOREIGN KEY (MODEL_A_ID) REFERENCES MODEL_A (MODEL_A_ID),
FOREIGN KEY (MODEL_B_ID) REFERENCES MODEL_B (MODEL_B_ID)
) ORGANIZATION INDEX COMPRESS;
CREATE INDEX LINK_MODEL_IE1 ON LINK_MODEL (MODEL_B_ID, MODEL_A_ID) COMPRESS;
LINK_MODEL
これにより、特定の A の B をクエリするには、テーブル ヒープへのアクセスなし (テーブル ヒープはまったくない) であるインデックスの単純な範囲スキャンのみが必要になります。指定された B の As を照会するには、LINK_MODEL_IE1
テーブル ヒープへのアクセスなしで、 に対する単純な範囲スキャンが必要です。
残念ながら、すべてのデータベースがクラスタリングとインデックス圧縮をサポートしているわけではありませんが、DBMS と ORM で可能な限り多くのことを実装する必要があります。