ER図(EntityRelationDiagram)
各例は、業務ルールなどの暗黙の前提があって
初めて成り立つものもありますが、
特に前提条件を詳述するのは避けました。
厳密な内容よりも、エンティティ間の構造を理解するようにして下さい。
■E-R図
エンティティ(実体)間の関連を、
のいずれかに整理する。
この対応関係を
カーディナリティ
と言う。
左図の下線はキー属性を表す。
カーディナリティを判断するには、2つのエンティティについて、
- 何をキーとして連結しているのか(関連づけられているのか)
- そのキーについて、A→B、B→Aの両方向について、
1対1なのか、1対多なのか
を調べる必要がある。
図示した例を各々調査してみよう。
「部員」対「ホームページ」
- 部員とホームページは、部員番号によって連結されている。
- 部員一人に対して、ホームページは1つである。
- 1つのホームページに対応する部員も一人である。
よって、部員とホームページは1対1のカーディナリティを持つ。
「部員」対「所有機器」
- 部員と所有機器は、部員番号によって連結されている。
- 部員一人は、機器を複数所有している場合がある。
- 機器は、誰か一人の部員に所有(管理)されている。
(複数の部員が一台の機器を共有することは無い、とする。)
よって、部員と所有機材は、1対多のカーディナリティを持つ。
「部員」対「業務」
- 部員と(担当)業務は、業務番号によって連結されている。
- 部員一人は、複数の業務を担当することがある。
- ある業務は、複数の部員によって担当され得る。
よって、部員と(担当)業務は、多対多のカーディナリティを持つ。
多対多のカーディナリティがある場合には、エンティティのデータが
きちんと正規化されていないのでは、と検討してみるとよい。
今、部員と(担当)業務の例で、正規化を試みよう。
- 部員には、(業務番号,担当時間)の繰り返しコードが
含まれるため、これを(部員番号、業務番号、担当時間)の
エンティティに分離して第一正規形にする必要がある。
- (部員番号、業務番号、担当時間)について、
連結キーである部員番号、業務番号の両方が決まらないと
担当時間も決まらない。つまり、非キー属性が主キーに
対して完全関数従属になっており、
これで第二正規形の条件も満たしている。
- 他に属性もないので、従属関係にある非キーも無い。
つまり、推移的に関数従属な関係も存在しない。
従って、これで第三正規形の条件も満たしている。
こうして出来た(部員番号、業務番号、担当時間)のエンティティを
「担当」と呼ぶことにする。この、「担当」という、ちょっと
抽象的なエンティティ(実体)が分かりづらいが、
要するに「誰か1人の部員が、1つの業務を"担当"する、という
事実(実体)」に対応する記録(レコード)を表すものである。
「部員」対「担当」
- 部員と担当は、部員番号によって連結されている。
- 部員一人は、複数の担当(業務)を持つ。
- ある1つの担当については、部員一人が定まっている。
よって、部員と担当は、1対多のカーディナリティを持つ。
「担当」対「業務」
- 担当と業務は、業務番号によって連結されている。
- ある1つの担当については、どの業務かは一つに定まっている。
- 一つの業務に対しては、複数の担当(部員)が対応し得る。
よって、担当と業務は、多対1のカーディナリティを持つ。
■E-R図(鳥脚図法)
特に、あるエンティティに
複数のエンティティが
関連している時に、
その関連のあり方を
表現できる図法である。
以下、図示した各例に沿って記号の意味を解説する。
- 1対1結合
一人の夫に対しては、一人の妻しか対応しない。
同様に、一人の妻には、対応する夫は一人しかいない。
つまり、夫と妻は1対1に結合している。
一夫多妻制の場合は、一対多対応になるわけだが…。
- 多対1結合
一人の召使に対しては、主人は一人しかいない。
逆に、一人の主人は、複数の召使を持ちうる。
つまり、召使と主人は多対1に結合している。
- 選択
あるエンティティに対して、関連する複数のエンティティ「それぞれ」で、
対応関係があるかもしれないし、ないかもしれない時、これらは
「選択」の関係にあるという。
飼っているペットに対して、ある犬との関係は、あるかもしれないし、
ないかも知れない。また、猫についても同様である。
「選択」は、後述の「相互排他」や「相互包括」と違って、
関連する(かもしれない)複数のエンティティそれぞれの関係は独立して
いる(つまり相互には関係がない)。犬だけ飼ってるかもしれないし、
両方飼っているかもしれないし、何も飼っていないかもしれない。
- 相互排他
あるエンティティに関して、関連する複数のエンティティのうち、
どれか一つに対応関係を持ち、その他のエンティティには対応関係が無い。
つまり、たった一つのエンティティにのみ関係を持つ。
今日の晩飯について、寿司を取ったら肉定食との関係はなくなる。
逆に、肉定食を食べれば、寿司は食べない。
この例題では、両方食べるぞ!という大食漢はいない、と前提している。
- 相互包括
あるエンティティに関して、関連する複数のエンティティのうち、
どれか一つに対応関係を持てば、その他のエンティティすべてにも
対応関係がある。つまり、対応関係はオールorナッシングになる。
晩飯の食卓にごはんがのれば、茶わんもあるだろう。茶わんがあるからには
ごはんも出るだろう。
この例題では、和食に限っており、ライスが皿にのって出てくるような場合は
考慮しない、と前提している。(例題としてはちょっと苦しいかな)
これまでの解説をもとに、
右図の場合を検証してみよう。
- まず、包括関係(○)と多対1対応の記号から、もし一人の社員でも
技術職か事務職に対応関係があるなら、すべての社員たちは技術職か
事務職に対応関係がある、ということが示されている。
- 次に、相互排他(●)から、ある社員は、事務職か技術職の
どちらか一方にしか対応関係が無い、ということがわかる。
つまり、事務職と技術職を兼務することは無いとされている。
- この図からは、事務職の社員と技術職の社員がいるか否かは
判別できない。たとえば、社員全員が技術職であるかもしれない。