学生番号 | 氏名 | 学年 | 学部 | 学部所在地 | 科目名 | 成績 | 先生 |
---|---|---|---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 | 集合論 | 50 | 山崎 |
計算機概論 | 80 | 横倉 | |||||
27039 | 鈴木 | 3 | 医学部 | 鹿田 | ドイツ語 | 65 | 久保田 |
英語 | 70 | ワトソン |
非正規形を第1正規形に導く方法には次の二つがある。
1.フラットなテーブルにする方法
繰り返しグループを含めて、非正規形を単にフラットな表にする。ただし、全体のキーは{固定部分のキー、繰り返しグループ部分のキー}の連結キーになる。上記の例の場合、全体のキーは{学生番号、科目名}となる。
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 | 科目名 | 成績 | 先生 |
---|---|---|---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 | 集合論 | 50 | 山崎 |
計算機概論 | 80 | 横倉 | |||||
27039 | 鈴木 | 3 | 医学部 | 鹿田 | ドイツ語 | 65 | 久保田 |
英語 | 70 | ワトソン |
↓ (フラットなテーブルにする)
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 | 科目名 | 成績 | 先生 |
---|---|---|---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 | 集合論 | 50 | 山崎 |
27032 | 田中 | 1 | 工学部 | 津島 | 計算機概論 | 80 | 横倉 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 | ドイツ語 | 65 | 久保田 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 | 英語 | 70 | ワトソン |
2.繰り返しグループを分解する方法
繰り返しグループにもとの関係のキーを埋め込んで、関係を分解していく。この場合、繰り返しグループを含む側の関係のキーは{元の関係のキー、繰り返しグループ部分のキー}の連結キーになる。
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 | 科目名 | 成績 | 先生 |
---|---|---|---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 | 集合論 | 50 | 山崎 |
計算機概論 | 80 | 横倉 | |||||
27039 | 鈴木 | 3 | 医学部 | 鹿田 | ドイツ語 | 65 | 久保田 |
英語 | 70 | ワトソン |
↓(繰り返しグループを分解する)
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 |
---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 |
学生番号 | 科目名 | 成績 | 先生 |
---|---|---|---|
27032 | 集合論 | 50 | 山崎 |
27032 | 計算機概論 | 80 | 横倉 |
27039 | ドイツ語 | 65 | 久保田 |
27039 | 英語 | 70 | ワトソン |
(第2正規形に入る前に、関数従属のおさらい)
学生番号 | 氏名 |
---|---|
001 | 田中 |
002 | 鈴木 |
003 | 佐藤 |
学生番号 | 氏名 | 学部所在地 | 科目名 | 先生 |
---|---|---|---|---|
27032 | 田中 | 津島 | 集合論 | 山崎 |
27032 | 田中 | 津島 | 計算機概論 | 横倉 |
27039 | 鈴木 | 鹿田 | ドイツ語 | 久保田 |
27039 | 鈴木 | 鹿田 | 英語 | ワトソン |
科目名 | 先生 |
---|---|
集合論 | 山崎 |
計算機概論 | 横倉 |
ドイツ語 | 久保田 |
英語 | ワトソン |
部分関数従属と完全関数従属の違い 一つの表内でA、Bという列が存在するとして、Aの値によってBが一意に決定できるとき、BはAに関数従属であるという。 このうち、最小限の列の組合せを完全関数従属という。 よって、上記の部分関数従属の例では、学生テーブルに余計なキー”学生番号”があるため ”先生”は”科目名”に部分関数従属となってしまう。 完全関数従属の例にはこの”学生番号”がないため、”先生”は”科目名”に完全関数従属となる。 (…と思う。私が分からないなりにそう解釈しました。違っているかもしれません。) |
1.フラットなテーブルにする方法を用いて得られた第1正規形”学生”を、第2正規形へ分解する。
前述の”学生”は、以下のような部分関数従属性をもつ。
学生番号→氏名、学年、学部、学部所在地
科目名→先生
{氏名、学年、学部、学部所在地}は、主キーの一部である学生番号に、先生は主キーの一部である科目名に部分関数従属する。
従って”学生”は以下のように分解される。なお、成績は主キー(第1正規化に伴う連結キー)である{学生番号、科目名}に完全関数従属する。
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 | 科目名 | 成績 | 先生 |
---|---|---|---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 | 集合論 | 50 | 山崎 |
27032 | 田中 | 1 | 工学部 | 津島 | 計算機概論 | 80 | 横倉 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 | ドイツ語 | 65 | 久保田 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 | 英語 | 70 | ワトソン |
↓
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 |
---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 |
学生番号 | 科目名 | 成績 |
---|---|---|
27032 | 集合論 | 50 |
27032 | 計算機概論 | 80 |
27039 | ドイツ語 | 65 |
27039 | 英語 | 70 |
科目名 | 先生 |
---|---|
集合論 | 山崎 |
計算機概論 | 横倉 |
ドイツ語 | 久保田 |
英語 | ワトソン |
2.繰り返しグループを分解する方法によって得られた第1正規形の”履修”を第2正規形へ分解する。
第1正規形の際に作成した以下の”履修”において、成績は主キーである{学生番号、科目名}に完全関数従属である。
{学生番号、科目名}→成績
また、”先生”は主キーの一部である”科目名”に部分関数従属である。
科目名→先生
従ってこれを分解する。
学生番号 | 科目名 | 成績 | 先生 |
---|---|---|---|
27032 | 集合論 | 50 | 山崎 |
27032 | 計算機概論 | 80 | 横倉 |
27039 | ドイツ語 | 65 | 久保田 |
27039 | 英語 | 70 | ワトソン |
↓
学生番号 | 科目名 | 成績 |
---|---|---|
27032 | 集合論 | 50 |
27032 | 計算機概論 | 80 |
27039 | ドイツ語 | 65 |
27039 | 英語 | 70 |
科目名 | 先生 |
---|---|
集合論 | 山崎 |
計算機概論 | 横倉 |
ドイツ語 | 久保田 |
英語 | ワトソン |
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 |
---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 |
第2正規形を第3正規形へ分解する。
上記の推移関数従属性をもつ関係”学生”を、次のように分解する。
学生番号 | 氏名 | 学年 | 学部 | 学部所在地 |
---|---|---|---|---|
27032 | 田中 | 1 | 工学部 | 津島 |
27039 | 鈴木 | 3 | 医学部 | 鹿田 |
↓
学生番号 | 氏名 | 学年 | 学部 |
---|---|---|---|
27032 | 田中 | 1 | 工学部 |
27039 | 鈴木 | 3 | 医学部 |
学部 | 学部所在地 |
---|---|
工学部 | 津島 |
医学部 | 鹿田 |
ボイスコッド正規形に分解する。
以下の例を考える。
学生番号 | 科目名 | 先生 |
---|---|---|
27032 | 集合論 | 山崎 |
27032 | 計算機概論 | 横倉 |
27039 | ドイツ語 | 久保田 |
27039 | 英語 | ワトソン |
前提条件として、”学生”は複数の科目を履修し、”先生”はただ一つの科目を教える。主キーは”学生番号”と”科目名”の複合キーである。
まず、この表には繰り返し項目がないから、第1正規形である。
また、主キーである”学生番号”と”科目名”の複合キーに、”先生”が完全関数従属しているので第2正規形である。
さらに、推移的関数従属がないため第3正規形である。
☆この表の不具合☆
科目名”集合論”を履修している学生番号”27032”の行を削除してしまうと、担当する”先生”の情報も失われてしまう。
よって、以下のように分解する。
学生番号 | 科目名 |
---|---|
27032 | 集合論 |
27032 | 計算機概論 |
27039 | ドイツ語 |
27039 | 英語 |
科目名 | 先生 |
---|---|
集合論 | 山崎 |
計算機概論 | 横倉 |
ドイツ語 | 久保田 |
英語 | ワトソン |
☆第3正規形とボイスコッド正規形の違い☆
第3正規形では、Aが関係Rの任意のキーの要素であるとき、Aが主キーに完全関数従属することを求めない。これがあるためにボイスコッド正規形より緩い条件となる。
ex.)以下の表を考える。
業者番号 | 業者名 | 商品番号 | 数量 |
---|---|---|---|
001 | 業者A | 商品A | 1 |
002 | 業者B | 商品A | 2 |
003 | 業者C | 商品B | 1 |
前提条件として、業者名はユニークである。
候補キー |
---|
業者番号 | 業者名 | 商品番号 | 数量 |
---|
業者番号 | 業者名 | 商品番号 | 数量 |
---|
以上のように、この二つの候補キーは、商品番号が重複する重複キーである。
一方、業者番号→業者名なる部分関数従属を持つにもかかわらず、業者名は{業者名、商品番号}からなるキーの要素であり、上述した「任意のキーの要素である」を満たすため、第3正規形である。
同様に、業者名→業者番号なる部分関数従属を持つにもかかわらず、業者番号は{業者番号、商品番号}からなるキーの要素であり、上述した「任意のキーの要素である」を満たすため、第3正規形である。
なお、業者名、業者番号はともに、候補キーの一部をなす属性であるから、第2正規形の定義「関係Rの主キー以外の属性はいずれも、いかなる候補キーにも完全関数従属である。」を満たす。
上記の表”仕入”は、業者名の変更の際に、更新忘れ等の問題が生じるため、以下のように分割したほうが良い。
この場合は、ボイスコッド正規形となる。
業者番号 | 業者名 |
---|---|
001 | 業者A |
002 | 業者B |
003 | 業者C |
業者番号 | 商品番号 | 数量 |
---|---|---|
001 | 商品A | 1 |
002 | 商品A | 2 |
003 | 商品B | 1 |