ER図の書き方やカーディナリティについての記事が少なく、私自身困った経験があります。
私がER図を作成する際にカーディナリティについてどのように紐解いているのか共有できればと思います。
図書館の貸し出し管理を行うアプリを例に挙げて説明していきます。
以下のテーブルがあります。
- 図書マスタテーブル
- 利用者マスタ
- 貸出テーブル
テーブル間で外部キー(同じカラム)を探す。
図書マスタ(BOOK)
book_id | title |
---|---|
1 | 桃太郎 |
2 | 金太郎 |
3 | 一寸法師 |
4 | かぐや姫 |
本当であれば、もっとカラムがあると思いますが、割愛いたします。(以降のテーブルも同様です。)
利用者マスタ(USER)
user_id | name |
---|---|
1 | 近本 |
2 | 中野 |
3 | 森下 |
4 | 大山 |
貸出テーブル(LEND)
lend_id | user_id | book_id | lend_date |
---|---|---|---|
1 | 1 | 1 | 第1月曜日 |
2 | 2 | 3 | 第1木曜日 |
3 | 4 | 2 | 第2水曜日 |
4 | 3 | 4 | 第2火曜日 |
5 | 3 | 1 | 第2火曜日 |
以上のテーブルのカラムから外部キー(同じ名前のカラム)として、
- 図書マスタのbook_idと貸出テーブルのbook_id
- 利用者テーブルのuser_idと貸出テーブルのuser_id
を見つけられます。
アプリケーションが複雑になれば、外部キーが同じ名前でない場合や、複数あることもあります。
さぁ本題のカーディナリティの考え方なのですが、私は SQL を用いております。
SELECT * FROM BOOK WHERE book_id = 1;
以上のようにリレーションがある(外部キー、すなわち同じ名前のカラムを持っているテーブル)テーブルで同じ名前のカラムをwhere句に入れてレコードを取得したと仮定しましょう。
今回の場合、レコードは1件だけとれるはずです。(主キーなので一件だけとれるのは当たり前ですが,,,)
SELECT * FROM LEND WHERE book_id = 1;
今回は貸出テーブルで同じ名前のカラムをwhere句に入れてレコードを取得します。
今回は2件取得できます。このように外部キー、すなわち同じ名前のカラム(テーブル結合する際の結合点)をwhere句に入れた際に必ず1件だけとれるテーブルが1。複数レコードが取得できるテーブルが多なのです!