一般的なリレーショナル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
を書くようになっているのも気になっています。