🧊

MermaidのER記法でのカーディナリティの書き方

を、覚えたいための備忘録。

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 : ""

この例の場合だと、

  • CARNAMED-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になってるなら実線、そうでないなら点線という感じか。