一般的なリレーショナルDBは0..nと1..nを区別することは不可能?
前置き
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共に表現可能です。
つまり
オプショナルな多重度1はNot NUll(NN)制約なしオプショナルでない多重度1はNot Null(NN)制約付与
でリレーショナルDB上表現可能です。
質問
0..nと1..nをリレーショナルDB的に区別するには?
MySQL :: MySQL Workbench
のER図では多重度の0..nと1..nは「Mandatoryのチェック」を外したり付けたりすることで表現可能です(厳密には多重度がオプショナルかオプショナルでないかの設定)。
一方で、0..nと1..nをリレーショナルDB的に表現するにはどうすればいいのか気になってしまいました(言い方を変えるとオプショナルな多重度nとオプショナルでない多重度nの表現方法はどうすればいいのか気になってしまいました)。
プログラム側で(例えばRailsのバリデーション機能を使うなどで)表現することは可能だと思います。しかしDBだけでやるとするとどうなるのでしょうか?
DBだけで表現することが不可能なのであれば、1であることは保証できない(つまりオプショナルではないことは保証できない)ので、常に0..nになってしまうのかと思うのですが、MySQL :: MySQL Workbenchで多重度を書くツールのデフォルト動作は1..nを書くようになっているのも気になっています。

