テーブルAとテーブルBがN対Nのリレーションを持つ場合、中間テーブル (ABテーブル) を用意して効率的に検索する方法をご紹介します。これにより、テーブルAからテーブルB、またはその逆方向に検索することができます。
1. テーブル構造の定義
まず、3つのテーブル構造は以下のようになります:
テーブルA
-
a_id
(主キー) -
a_name
(データ属性)
テーブルB
-
b_id
(主キー) -
b_name
(データ属性)
中間テーブルAB
-
a_id
(テーブルAの外部キー) -
b_id
(テーブルBの外部キー)
2. テーブルの関連図
N対Nのリレーション構造は次のように表せます:
Aテーブル ABテーブル Bテーブル
+----------+ +--------------+ +----------+
| a_id | <--> | a_id | <--> | b_id |
| a_name | | b_id | | b_name |
+----------+ +--------------+ +----------+
3. 検索クエリ例
例1: テーブルAに関連するテーブルBのレコードを検索
特定のa_id
に関連するB
テーブルのデータを取得する場合、以下のクエリを使用します。
SELECT B.b_name
FROM B
JOIN AB ON B.b_id = AB.b_id
JOIN A ON A.a_id = AB.a_id
WHERE A.a_id = '指定のa_id';
例2: テーブルBに関連するテーブルAのレコードを検索
特定のb_id
に関連するA
テーブルのデータを取得する場合、以下のクエリを使用します。
SELECT A.a_name
FROM A
JOIN AB ON A.a_id = AB.a_id
JOIN B ON B.b_id = AB.b_id
WHERE B.b_id = '指定のb_id';
4. インデックスの活用
検索を効率化するために、中間テーブルAB
にはa_id
とb_id
の両方にインデックスを作成することが推奨されます。これにより、JOIN操作が高速化され、N対Nのリレーションを効率的に検索できます。
CREATE INDEX idx_ab_a_id ON AB(a_id);
CREATE INDEX idx_ab_b_id ON AB(b_id);