前回はエンティティとリレーションシップとはということについて整理しました。
https://www.learning-nao.com/?p=3054
エンティティ間の関係性がリレーションシップでしたが、エンティティ間の対応関係はリレーションシップによって異なります。その対応関係を表現できるのが多重度です。多重度はカーディナリティとも呼ばれます。今回はその多重度について内容を整理していきます。
多重度
多重度とはエンティティ間の対応関係です。多重度には1対1や1対多、多対多といったものがあります。それぞれのケースを順に考えてみようと思います。
1対1
学生と連絡先の関係を考えてみます。学生から見て連絡先は1つに決まり、連絡先から見ても学生は1人に決まります(特殊なケースは考慮していません)。この場合、1対1の対応関係が成り立ちます。
1対1の対応関係は単純な線で表現します。
1対多
学生と学部の関係を考えてみます。以下の対応関係が当てはまります。
- 学生はどれか1つの学部に所属する
- 1つの学部には複数の学生が所属する
この場合1対多の関係が成り立ちます。1対多の関係は、下図のように矢印を使って表現します。矢印は、主キー側から外部キー側に向かって引きます。
以下では、学生エンティティで学部エンティティの主キーである学部IDを外部キー(FK)として保持することになるので、学部から学生に向かう矢印を引きます。学部が1、学生が多の関係です。
多対多
学生と授業の関係を考えてみます。両者には以下の関係が成り立ちます。
- 学生は複数の授業を履修する
- 1つの授業には複数の学生が出席する
こういった場合が多対多の関係です。多対多の関係は、両方向の矢印で表現します。
多対多は実際のデータベース設計においてはほとんど出てきません。これは、この関連は論理データモデルに転換していくと非正規形になるためです(どちらに外部キーを持たせてもその外部キーが繰り返し項目になる)。多対多の関係が存在する場合は、その間に連関エンティティを1つおいて、1対多の関連に変換するのが一般的です。
オプショナリティ
オプショナリティとは、多重度にゼロが含むかを区別して表記するものです。多重度0が発生しない場合は●、多重度0が発生する可能性がある場合は〇を表記します。
例えば、1人も存在しない学部はありませんし、学生は必ずどこかの学部に所属します(学部に所属しない学生ってどうやって入試受けたんやって話になるので)。この場合、0は起こりえないので●を表記します。
続いて授業と学生の例を考えてみます。授業は1人でも学生がいないと成立しませんが、授業を1つも受けない不届き者がいるかもしれません。この場合、学生から授業に向かう側が〇になります。
DBについてより学ぶ
データベース、SQLについて、書籍を通してより深く知ることができます。ネットでも情報は手に入りますが、書籍も是非検討してみてください^^
まとめ
多重度について内容を整理しました。
多重度を理解することで、ER図を見ただけでエンティティの関係性や具体的なインスタンスのつながりをイメージできるようになります。
データベースの設計において多重度は重要で、意識して設計する必要があります。今回例に挙げてはいますが、多対多のリレーションシップが残らないようにように設計することが重要です。
ではでは👋