カーディナリティが多対多の概念データモデルがなぜ関係モデルとして論理データモデルに変換できないか
今読んでいる本に
「多対多のリレーションシップが存在すると、そのままでは関係モデルとして取り扱うことができません。」
とだけ書かれていて,よくわからなかったので自分なりに考えてみた.
前提
- まずいろいろ考えてて以下のことに気づいた
関係モデルとして概念データモデルを論理データモデルへの変換する時,エンティティ間のリレーションシップは共通の属性を持つことで表現する
- 次にリレーションシップのカーディナリティが多対多となる概念データモデルを考えてみる
- エンティティ「売上」
- 属性「売上番号」
- 属性「売上日」
- エンティティ「商品」
- 属性「商品コード」
- 属性「商品名」
- 売上に複数の商品が含まれることも,商品が複数の売上に含まれることもあるので
エンティティ「売上」とエンティティ「商品」間のリレーションシップのカーディナリティは多対多になる.
- エンティティ「売上」
エンティティ「売上」に属性「商品コード」を持つことでリレーションシップを表現する場合の関係モデル
売上番号 | 売上日 | 商品コード |
---|---|---|
001 | 2013-06-05 | Item017 |
Item044 | ||
Item057 |
- 一つの売上に複数の商品が含まれる場合に商品コードのところがおかしなこと(非単純定義域)になってしまう.
エンティティ「商品」に属性「売上番号」を持つことでリレーションシップを表現する場合の関係モデル
商品コード | 商品名 | 売上番号 |
---|---|---|
Item017 | おもち | 001 |
007 | ||
059 |
- 一つの商品が複数の売上に含まれる場合に売上番号のところがおかしなこと(非単純定義域)になってしまう.
というわけで,たしかにそのままだと関係モデルとして扱えないことがわかった.
おまけ
- 関係モデルとして概念データモデルを論理データモデルへ変換する際,リレーションシップを表現するために共通の属性を持つときは
「多」側のエンティティに「1」側の属性を持つ
ようにする. (非単純定義域のことを考えると当たり前なんだけど,この当たり前がイメージできなかった…)