多対多の関連とは
多対多の関連とは、データベース設計において、テーブルAの1つのデータに対してテーブルBの複数のデータが対応し、同時にテーブルBの1つのデータに対してもテーブルAの複数のデータが対応するような関係性のことです。
リレーショナルデータベースでは、「多対多」の関係を直接テーブル同士で繋ぐことができません。もし直接繋ごうとすると、データが重複したり、検索が著しく困難になったりします。そのため、多対多の関連を表現する際は、その間に「中間テーブル(連関エンティティ)」と呼ばれる中継用のテーブルを1つ挟み、「1対多」の関係が2つ組み合わさった形に変換して設計します。
具体例
「学生」と「授業」の関係を考えします。1人の学生は「英語」「数学」など「複数(多)」の授業を履修します。同時に、1つの授業には「Aさん」「Bさん」など「複数(多)」の学生が参加するため、これは多対多の関係です。データベースでは「履修登録テーブル」という中間テーブルを用意し、そこに「学生ID」と「授業ID」のペアを保存していくことで、誰が何の授業を受けているかを綺麗に整理できます。
もう少し詳しく
多対多の関連をそのまま表現しようとすると、例えば学生テーブルの1つのセルの中に「英語、数学、理科」のように複数の授業IDをカンマ区切りで詰め込む(第1正規形違反)か、あるいは同じ学生の行を何行も重複して登録する(主キーの重複違反)という設計上の破綻が発生します。これを解決するために挿入する「中間テーブル(結合テーブル/連関エンティティ)」は、テーブルAの主キーとテーブルBの主キーを組み合わせた「複合主キー」を持ちます。この設計により、多対多の関係が「テーブルA(1)対 中間テーブル(多)」および「テーブルB(1)対 中間テーブル(多)」という、RDBが処理しやすいクリーンな構造に変換されます。また、中間テーブルには、単に2つのIDを結びつけるだけでなく、「履修登録日」や「成績」といった、その関連自体に紐づく追加の属性情報を持たせることも一般的です。
試験でのポイント
試験では、ER図(実体関連図)に描かれた実体(エンティティ)間の関連度(カーディナリティ)を読み取り、多対多の関係にある部分を見つけ出す問題が出題されます。ER図で多対多(しばしば「M:N」や、鳥の足のような記号で両端が表されます)の関連が示されている場合、データベースの実装(スキーマ設計)フェーズでは「必ず中間テーブルを設計して1対多の関係に分解する」というルールを理解しているかが問われます。また、概念設計から論理設計へ移行するプロセスにおいて、どのように主キーを設定し、テーブル間の外部キー制約を定義するかという具体的なスキーマ記述問題も出題されるため、ER図からテーブル定義への変換手順を練習しておきましょう。
関連する用語
多対多の関連に関連する用語としては、多対多を分解するために設計する「中間テーブル(連関エンティティ)」や、2つ以上の列を組み合わせて設定する「複合主キー」があります。また、テーブル間の参照関係を示す「外部キー」、データの関連度を表す「カーディナリティ」、そして設計図である「ER図(エンティティ・リレーションシップ図)」も非常に重要な関連用語です。