前置き

MySQL :: MySQL Workbench
ER図を書いていました。

0..1と1を表現することはER図的にもリレーショナルDB的にも可能

ER図多重度0..1を示すには「Mandatoryのチェックを外す」ことで表現できました(厳密には0部分は多重度オプショナリティの話)。

これはリレーショナルDB的には「Not Null制約(NN)をしない」のと同義になります。

多重度1を示すには「Mandatoryのチェックを入れる」「Not Null制約(NN)付与」で
同様にER図リレーショナルDB共に表現可能です。

つまり

  • オプショナルな多重度1Not NUll(NN)制約なし
  • オプショナルでない多重度1Not Null(NN)制約付与

リレーショナルDB上表現可能です。

画像の説明をここに入力

質問

0..nと1..nをリレーショナルDB的に区別するには?

MySQL :: MySQL Workbench
ER図では多重度0..n1..nは「Mandatoryのチェック」を外したり付けたりすることで表現可能です(厳密には多重度オプショナルオプショナルでないかの設定)。

画像の説明をここに入力

一方で、0..n1..nリレーショナルDB的に表現するにはどうすればいいのか気になってしまいました(言い方を変えるとオプショナルな多重度nオプショナルでない多重度nの表現方法はどうすればいいのか気になってしまいました)。

プログラム側で(例えばRailsのバリデーション機能を使うなどで)表現することは可能だと思います。しかしDBだけでやるとするとどうなるのでしょうか?

DBだけで表現することが不可能なのであれば、1であることは保証できない(つまりオプショナルではないことは保証できない)ので、常に0..nになってしまうのかと思うのですが、MySQL :: MySQL Workbench多重度を書くツールのデフォルト動作は1..nを書くようになっているのも気になっています。