

## 前置き

[MySQL :: MySQL Workbench](https://www.mysql.com/products/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`上表現可能です。

[![画像の説明をここに入力](https://i.stack.imgur.com/nde1u.png)](https://i.stack.imgur.com/nde1u.png)

## 質問

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

[MySQL :: MySQL Workbench](https://www.mysql.com/products/workbench/)  
の`ER図`では`多重度`の`0..n`と`1..n`は「`Mandatoryのチェック`」を外したり付けたりすることで表現可能です(厳密には`多重度`が`オプショナル`か`オプショナルでない`かの設定）。

[![画像の説明をここに入力](https://i.stack.imgur.com/tIzKY.png)](https://i.stack.imgur.com/tIzKY.png)

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

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

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


CC BY-SA 3.0
2017-07-30T00:33:33.867
36779
2017-07-30T04:43:25.793
2017-07-30T04:43:25.793
9008
9008
question
database
一般的なリレーショナルDBは0..nと1..nを区別することは不可能？