を、覚えたいための備忘録。
Cardinality Identification Cardinality
たとえば、CUSTOMER ||--o{ ORDER : ""と書いたときの、||--o{の部分がリレーション(relationship)部。
で、この部分はさらに3つに分けられる。
||: Cardinality--: Identification|{: Cardinality
このカーディナリティ部分について。
まず左側のエンティティ用に、
|o||}o}|
という4パターンがあり、右側のエンティティにも、
o|||o{|{
という4パターンがある。左側と右側では、}と{の向きが違う。
で、この部分も構成としては2パートになってるのがわかる。
| or }(または{)の外側部分と、o or |の内側部分。
カーディナリティの外側
これの覚え方は簡単で、単純に”1”なのか”多”なのかってだけ。
2つのエンティティがあったとき、その関係性が、
- 1:1 =
|?--?| - 1:N =
|?--?{ - N:1 =
}?--?| - N:N =
}?--?{
というだけで、これは直感的にも理解できる。(内側部は?として考える)
交差テーブルなら自ずと}?--?{になるし、だいたいは|?--?{と}?--?|になるんではなかろうか。
カーディナリティの内側
個人的に覚えられないのがコレ。
ER図の種類によっては、この内側の定義が不要な場合もあるらしいが、Mermaidでは必須。Optionalityと呼ばれることもあるらしい。
ここは、それぞれの関係性が”0以上”なのか”1以上”なのかを表すとのこと。さっきの外側が最大値を表すならば、この内側にあたる部分は最小値を表す、と。
CAR ||--o{ NAMED-DRIVER : ""
この例の場合だと、
CARとNAMED-DRIVERは1:多の関係- 1台の車を複数のドライバーが使う
そして、
CARが1つあっても、NAMED-DRIVERが0な可能性があるNAMED-DRIVERが1つあるとき、CARは必ず1つある
ということを表してる。
考え方
ついつい俯瞰で考えたくなってしまうが、それをやると混乱する。
カーディナリティの外側は、俯瞰でも判断できるけど、内側はそれができないので。
必ず左右どちらかのエンティティの気持ちになって、「自身が1つあるとき、その対応はどうなる?」という考え方で判断していく。
┌ NAMED-DRIVERの視点で決める
CAR ||--o{ NAMED-DRIVER : ""
└ CARの視点で決める
こう考えれば混乱しない。
もしくは割り切ってしまって、|だけ使ってoは使わない。頑張って覚えようとしてたけど、もうこれでいいんでは?ってなりつつもある。
おまけ
Identification部は、
--(実線)..(点線)
という2パターンあって、それぞれのテーブルが、互いの存在に関わらず存在できるか?で判断するらしい。
親テーブルのPKが、子テーブルのPKでFKになってるなら実線、そうでないなら点線という感じか。