【T8a】多対多のリレーションシップ(5/8)
プロジェクトタイプ | (注意: 本文参照) |
---|---|
プロジェクト名 | T8a |
ソリューション名 | PIT8 |
注意
- 本ページの作業内容は 前のページまでの続き になっていることに注意せよ.
- 先に前のページまでをすべて読み,指示されている作業を済ませてから本ページを読むこと.
- プロジェクトの作成作業については準備作業を参照せよ.
8a-5. 多対多のリレーションシップ
前節での説明の通り,一対多のリレーションシップはウェブアプリでは最も基本的かつ重要なリレーションシップであるが, アプリケーションで扱う必要があるリレーションシップはそれだけとは限らない.たとえば,ここまで扱ってきた「学生」の エンティティに対して「サークル」というエンティティを考えてみよう.
大学にもよるが,学生のサークル活動に関して一人の学生が複数のサークルに所属することができるという制度がとられているケースは多い. チュートリアル【T7b】で説明した多重度の分析方法を覚えているだろうか.このような制度をもつ大学における「学生」と 「サークル」というエンティティに対して「 一方のエンティティを具体的に一つ定めたときに,もう一方のエンティティはいくつ定まるか? 」という 質問をしてみると以下のように分析できるはずである(_).
- 「学生」から見た「サークル」の多重度
- 一人の学生を具体的に定めれば,その学生が所属しているサークルは複数あり得る.
- したがってこの多重度は「 多 」である.
- 「サークル」から見た「学生」の多重度
- 一つのサークルを具体的定めれば,そのサークルには複数人の学生が所属している.
- したがってこの多重度は「 多 」である.
「学生」と「サークル」のあいだの所属に関する多重度は「 多対多 」である.「学生」と「学科」の場合では,通常学生は一つの学科に しか所属できないため一対多であったが,「サークル」の場合にはそのような制限はないため多対多の関係となる. そして本節で述べておきたい最も重要なこととして EF Core は多対多のリレーションシップを直接的にはサポートしない ということである. また現実のリレーショナルデータベース製品でも,多対多のリレーションシップを直接的に扱うことができるものは存在しない. これはリレーショナルモデルや EF Core に固有の制限というよりも,概念スキーマに対する物理スキーマの設計の定石といったほうが正確である. 通常,このような多対多の関係はリレーショナルデータベースにおけるテーブル設計では直接的に扱わず, 「二つのエンティティ間の関係」を表す エンティティを追加して表現する のが一般的である.これは「対照表」などとも呼ばれる.例えば,「学生」と「サークル」ならば_に示すように その間に「サークル所属」というエンティティを追加する.
これによって「学生」「サークル所属」の一対多のリレーションシップと,「サークル」「サークル所属」の一対多のリレーションシップの 二つのリレーションシップが形作られるが,これらを使って多対多を表現するのが定石である.
以降では実際にこのようなリレーションシップを作成してみよう.