【たたいたりれーしょん】

多対多リレーション とは?

最終更新:
💡 学生と講義、タグと記事——「どっちも複数OK」な関係は中間テーブルで繋ぐ

両側の1件が、それぞれ相手側の複数件と対応できるデータの関係。リレーショナルデータベースでは、双方のキーを持つ中間テーブルで表すのが基本。

📌 このページのポイント
学生と講義:どちらも複数の相手 学生 ID 名前 1 田中 2 佐藤 講義 ID 名前 1 数学 2 英語 1対多 1対多 受講(中間) student_id course_id 1 1 1 2 2 1 1行が「誰が・何を受講するか」の組
田中は数学・英語、佐藤は数学を受講する例。外部キーで両表を参照する。線は参照関係を示し、処理の順番ではない。
ひよこ ひよこ
多対多リレーションってどういう関係?
ペンギン先生 ペンギン先生
例えば学生と講義だよ。田中さんは数学と英語を受講し、数学には田中さんと佐藤さんが参加する。どちらも複数の相手を持てるでしょ?
ひよこ ひよこ
テーブルではどうやって表現するの?
ペンギン先生 ペンギン先生
学生と講義の間に「受講」という中間テーブルを作るんだ。student_idとcourse_idという2つの外部キーを持たせ、どの学生がどの講義を受けるかを1行ずつ記録するよ。
ひよこ ひよこ
中間テーブルにはIDだけを入れるの?
ペンギン先生 ペンギン先生
受講日や成績といった、その組み合わせに属する情報も入れられるよ。「田中さんの数学は90点」のようにね。
ひよこ ひよこ
Webアプリでも多対多って使うの?
ペンギン先生 ペンギン先生
記事とタグ、商品と注文などでも使えるよ。ORMにも対応機能がある。例えばDjangoは中間テーブルを自動で作る方法と、追加項目を持つ中間モデルを指定する方法があるんだ。
ひよこ ひよこ
同じ受講データを二重に登録しないようにするには?
ペンギン先生 ペンギン先生
学生と講義の組に一意性を持たせよう。例えば2列を複合主キーにするか、別のIDを主キーにして2列の組へUNIQUE制約を付ける。再受講も記録するなら、年度などを含めて何を1件とするか決めるんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「多対多リレーション」って出てきたら「中間テーブルで両方向に複数つながる関係」と思えればだいたいOK!
📖 おまけ:英語の意味
「Many-to-Many Relationship」 = 多対多の関係
💬 双方が複数の相手を持てるという意味。中間テーブルでは、それぞれの対応を1行ずつ保存するよ。

参考資料

← 用語集にもどる