テーブルの関連のパターン
同じ意味の列を持つテーブル同士の間には、通常次の3パーンの関連がある。
1対1(1:1)
『1対1』というのはほぼ見ないらしい。理由は2つのテーブルのレコードが1対1に対応するというのは、主キーが一致するケースなので、通常1つのテーブルにまとめても問題ないため。よって、正規化の過程で『1対1』のテーブルが作られることは無い。
1対多(1:N)
『1対多』は最もよくある関連のタイプ。正規化によって作られる関連の多くはここに属する。
多対多(N:N)
『多対多』は特殊なカテゴリで、RDBMSでは『多対多』の関連は作っていけないことになっている。理由は、多対多では、両者のエンティティが共通のキーとなる列を保持していないことで、両エンティティを結合した情報を取得できないため。
それを解決するために、両者の間に、第3のエンティティとして関連実体を追加する。これは、『実在としては存在しないが、関連としては存在している』というような関連としての事実を追加するみたいなイメージと理解した😐
具体的なイメージを考える。学生は複数の講義を取ることができ、講義もまた複数の学生が参加できる。それをER図で示すと次のようになる。
上の状態で、1人の学生が講義を複数取ろうとすると、学生テーブルに同一学生コードを追加することになってしまう。(主キーなのに同一のものがある😫)
そこで関係実体の出番。両者の間には『受講する』という事実上の関係があるので、それを追加する。そうしてあげることで、『多対多』問題が解消され、ある学生は複数の講義を受講できるという関係を正しく表現できるようになる。
ER図の描き方
代表的な書き方は次の2つ。2つの特徴について、同じ関係を示すER図と、カーディナリティ(相手エンティティと対応するレコード数)の記号合わせて説明する。
IE表記法:鳥の足のような見た目の直感的にわかりやすいER図。厳密に書くのは苦手。
記号の意味は次のとおり。
記号 意味 ○ 0 - 1 /|\ 多(2以上) IDEF1X:「●」や「◇」を用いた抽象度の高いER図。厳密に書くのが得意。「●」は『多』の側にだけつける。
記号の意味は次のとおり。
記号 意味 ● 0以上 ●P 1以上 ●Z 0または1 ●n 特定の定数 部署についている「◇」は、部署コードが
NULL
でありうることを示している。また、独立エンティティ(他のテーブルのデータに依存することなくデータを保持できるエンティティ)を角の尖った四角で示し、従属エンティティ(他のテーブルが存在しないとデータを保持することができないエンティティ)を角の丸い四角で示す。
さらに、実線は依存リレーション(社員が会社に必ず属さなければいけないという関係)を示し、点線は非依存リレーション(必ずしも社員が部署に所属しなくてもよいという関係)を示す。