DB設計関連

◆ E-R図

 E-R図とは、データ構造をモデル化する手法で、実体(Entity)と関連(Relationship)の2つの概念を用いて表現します。 過去問題では E-R図の描き方より、見方の方が分かっておく方が良いでしょう。
 例として下の図の様に表があったとします。

教員表
教員コード 教員名 担当
0001 AAAA 化学
0002 BBBB 社会
0003 CCCC 数学
  生徒表
生徒コード 生徒名 担当教員
0001 ああああ 0001
0002 いいいい 0002
0003 うううう 0001
0004 ええええ 0002
0005 おおおお 0003
0006 かかかか 0002
0007 きききき 0003
0008 くくくく 0001


 教員コードと担当教員が同じ繋がり(関連)があるとします。下線部があるのはキー項目(ユニークキー)とします。 教員表の教員コードは重複してはいけないのに対して、生徒表は教員コードは重複して良い事になります。 すなわち、教員表は「1」に対して生徒表は「多」という事です。 これを E-R図 で表すと下のようになります。



 注意点は、矢印が刺さっている方が「多」になります。
 問題では、矢印ではなく「多」の方に「*」などで表現する場合があるので注意しましょう。


◆ 正規化

 データの正規化とは、データの冗長性(重複)をなくしてデータの属性間の関連を単純にする(要はまとめる)事です。 正規化をする事によって、データ追加、更新、削除を行っても、データの一貫性、整合性が保てるようになります。
 正規化とは以下の様な形態があります。

第1正規形 ・・・ テーブル内のフィールドの値に複数の値を含んだり、異なる属性を含んだりしないもの。
繰り返し属性を含んでいないもの。

第2正規形 ・・・ 第1正規形かつ、主キーに関数従属している項目と、主キーの一部に関数従属している項目を分離した表。

第3正規形 ・・・ 第2正規形で、主キー以外の項目に関数従属している項目を分離した表。


 ・・・と言葉で書いても分かりませんので、以下なような感じだと思います。

 ●非正規形

 正規化されていない状態の事です。
 下のような感じのデータの事を言います。

生徒名 受講科目 担当教員
ああああ 数学、理科、英語 BBBB(数学)、DDDD(理科)、英語(EEEE)
いいいい 国語、数学、社会、理科、英語 AAAA(国語)、BBBB(数学)、CCCC(社会)、DDDD(理科)、英語(EEEE)
うううう 国語、社会、英語 FFFF(国語)、GGGG(社会)、EEEE(英語)


上のように1つのフィールドの中に、複数の値が入ってたりします。
繰り返し属性とは、下の様な感じだと思います。

生徒名 科目1 科目2 科目3 教員1 教員2 教員3
ああああ 国語 社会 英語 FFFF GGGG EEEE


 要は、科目とか教員とか、似たような属性が繰り返し使われている事を指します。

 ●第1正規形

 上記のデータを第1正規形にしましょう。
 フィールドの値に複数の値を含んだり、繰り返し属性を排除した物なので、以下の様になれば良いと思います。
(ここで補足、生徒名、担当教員の名称は同姓同名が居ると問題なので、生徒コード、教員コードという項目を新しく追加させてもらいます。)

生徒コード 生徒名 受講科目 教員コード 教員名 担当科目
0001 ああああ 数学 000B BBBB 数学
0001 ああああ 理科 000D DDDD 理科
0001 ああああ 英語 000E EEEE 英語
0002 いいいい 国語 000A AAAA 国語
0002 いいいい 数学 000B BBBB 数学
0002 いいいい 社会 000C CCCC 社会
0002 いいいい 理科 000D DDDD 理科
0002 いいいい 英語 000E EEEE 英語
0003 うううう 国語 000F FFFF 国語
0003 うううう 社会 000G GGGG 社会
0003 うううう 英語 000E EEEE 英語


 この時、生徒名と担当教員が定まると、レコードが決まります。この2つを主キーといいます。
 また、担当教員が分かると受講科目が分かると思います。この関係を関数従属と言います。
 残りの受講科目ですが、主キーが決まらないとデータは定まりません。こういう項目を完全関数従属と言います。

 ●第2正規形

 第2正規形は、主キーに関数従属している項目と、主キーの一部に関数従属している項目を分離した表。 ・・・とあるので主キーの一部に関数従属といえば、おそらく下の様な関係でないかと思います。

・生徒コードが決まれば生徒名が決まる
・教員コードが決まれば教員名と担当科目が決まる

 そして、主キーに関数従属している項目は 「受講科目」
 なので、少なくとも生徒マスターと教員マスターというのが作れて分離できるはずです。

生徒マスター
生徒コード 生徒名
0001 ああああ
0002 いいいい
0003 うううう
  教員マスター
教員コード 教員名 担当
000A AAAA 国語
000B BBBB 数学
000C CCCC 社会
000D DDDD 理科
000E EEEE 英語
000F FFFF 国語
000G GGGG 社会
 
生徒コード 教員コード 受講科目
0001 000B 数学
0001 000D 理科
0001 000E 英語
0002 000A 国語
0002 000B 数学
0002 000C 社会
0002 000D 理科
0002 000E 英語
0003 000F 国語
0003 000G 社会
0003 000E 英語


 ●第3正規形

 主キー以外の項目に関数従属している項目を分離した表。となっています。 ですが、ちょっと今までの例だと該当がないので、教員マスターに「担当科目」が「科目コードと「科目名」の2つだったします。 これをまた分離してしまおうと言う事です。(主キーは生徒コードと教員コードなので、主キー以外の項目に関数従属している項目となる)

教員コード 教員名 科目コード 科目名
000A AAAA aaaa 国語



教員表
教員コード 教員名 科目コード
000A AAAA aaaa
  科目表
科目コード 科目名
aaaa 国語


◆ 参照制約

 参照制約とは、上記の表を例にしますと教員表の科目コードから、科目表の科目コードへ参照制約をかけるとします。 すると教員表でデータを登録する時、科目コードは科目表に存在するコードしか登録できないようになります。 要は教員表の科目コードが一致するしていないといけなくなる制約の事をいいます。
 また逆に科目表から1行削除しようとした時、その科目コードが教員表に存在したらエラーとなります。 (教員表のデータがが一致しなくなるため)



TOPページに戻る