を、覚えたいための備忘録。
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になってるなら実線、そうでないなら点線という感じか。