正規化理論


このページ内の目次

第1正規形
第2正規形
第3正規形
ボイスコッド正規形
第4正規形
第5正規形

データベーススペシャリスト目次へ


●第1正規形
関係Rがその属性に繰り返しグループを一つも含まないもの。

非正規形
関係の要素の中に繰り返しグループを含むような関係。
以下の例では、関係の中に{科目名、成績、先生}という繰り返しグループを含んでいる。
学生(非正規形)
学生番号 氏名 学年 学部 学部所在地 科目名 成績 先生
27032 田中 1 工学部 津島 集合論 50 山崎
計算機概論 80 横倉
27039 鈴木 3 医学部 鹿田 ドイツ語 65 久保田
英語 70 ワトソン

非正規形を第1正規形に導く方法には次の二つがある。

1.フラットなテーブルにする方法

繰り返しグループを含めて、非正規形を単にフラットな表にする。ただし、全体のキーは{固定部分のキー、繰り返しグループ部分のキー}の連結キーになる。上記の例の場合、全体のキーは{学生番号、科目名}となる。

学生(非正規形)
学生番号 氏名 学年 学部 学部所在地 科目名 成績 先生
27032 田中 1 工学部 津島 集合論 50 山崎
計算機概論 80 横倉
27039 鈴木 3 医学部 鹿田 ドイツ語 65 久保田
英語 70 ワトソン

            ↓ (フラットなテーブルにする)

学生(第1正規形)
学生番号 氏名 学年 学部 学部所在地 科目名 成績 先生
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正規形
関係Rが第1正規形で、関係Rの主キー以外の属性はいずれも、いかなる候補キーにも完全関数従属であるもの。

(第2正規形に入る前に、関数従属のおさらい)

関数従属
関係Rの属性X、Yにおいて、Xのどの値もそれぞれYの一つの値に対応するとき、YはXに関数従属であるといいX→Yと書く。

ex.)以下のような関係”学生”があったとき、学生番号が決まれば氏名がユニークに決定するため、氏名は学生番号に関数従属(学生番号→氏名)である。

学生
学生番号 氏名
001 田中
002 鈴木
003 佐藤
部分関数従属
関係Rにおいて、キー以外の属性がキーの一部に関数従属することを部分関数従属性という。

ex.)以下のような関係”学生”があったとき、キーの一部である科目名が決まれば先生がユニークに決定するため、先生は科目名に部分関数従属している。

学生
学生番号 氏名 学部所在地 科目名 先生
27032 田中 津島 集合論 山崎
27032 田中 津島 計算機概論 横倉
27039 鈴木 鹿田 ドイツ語 久保田
27039 鈴木 鹿田 英語 ワトソン
完全関数従属
関係Rの属性XがX1、X2、…の部分集合からなり、YがXに関数従属で、かつYがXのどの部分集合にも関数従属でないとき、YはXに完全関数従属という。

ex.)以下のような関係”科目”があったとき、キーである科目名が決まれば先生がユニークに決定するため、先生は科目名に完全関数従属している。

科目
科目名 先生
集合論 山崎
計算機概論 横倉
ドイツ語 久保田
英語 ワトソン
部分関数従属と完全関数従属の違い
一つの表内でA、Bという列が存在するとして、Aの値によってBが一意に決定できるとき、BはAに関数従属であるという。
このうち、最小限の列の組合せを完全関数従属という。
よって、上記の部分関数従属の例では、学生テーブルに余計なキー”学生番号”があるため
”先生”は”科目名”に部分関数従属となってしまう。
完全関数従属の例にはこの”学生番号”がないため、”先生”は”科目名”に完全関数従属となる。
(…と思う。私が分からないなりにそう解釈しました。違っているかもしれません。

1.フラットなテーブルにする方法を用いて得られた第1正規形”学生”を、第2正規形へ分解する。

前述の”学生”は、以下のような部分関数従属性をもつ。

学生番号→氏名、学年、学部、学部所在地
科目名→先生

{氏名、学年、学部、学部所在地}は、主キーの一部である学生番号に、先生は主キーの一部である科目名に部分関数従属する。
従って”学生”は以下のように分解される。なお、成績は主キー(第1正規化に伴う連結キー)である{学生番号、科目名}に完全関数従属する。

学生(第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
科目
科目名 先生
集合論 山崎
計算機概論 横倉
ドイツ語 久保田
英語 ワトソン

●第3正規形
第2正規形であり、かつすべての非キー属性が推移的に関数従属でない表。また、他の属性から演算などにより導き出せる属性(導出属性)は削除する。

推移的な関数従属
関係Rの重複しない属性X、Y、Zにおいて、Xが定まればYが定まり、Yが定まればZが定まるというもの(X→Y→Z)。
主キーに推移的に関数従属するとは、主キーからは直接求められないが、主キーに関数従属する属性に関数従属するということ。

ex.)以下の関係”学生”において、主キー以外の属性である学部と学部所在地には、関数従属性がある(学部が決まれば、学部所在地がユニークに決定する)。主キーである学生番号は、学部を関数決定するため、関係”学生”は、学生番号→学部→学部所在地なる推移関数従属性を持つ。

学生
学生番号 氏名 学年 学部 学部所在地
27032 田中 1 工学部 津島
27039 鈴木 3 医学部 鹿田

第2正規形を第3正規形へ分解する。

上記の推移関数従属性をもつ関係”学生”を、次のように分解する。

学生
学生番号 氏名 学年 学部 学部所在地
27032 田中 1 工学部 津島
27039 鈴木 3 医学部 鹿田

             ↓

学生
学生番号 氏名 学年 学部
27032 田中 1 工学部
27039 鈴木 3 医学部
学部
学部 学部所在地
工学部 津島
医学部 鹿田

●ボイスコッド正規形(BCNF:Boyce-codd normal form)
すべての決定項が候補キーである表。

また、部分関数従属、推移的関数従属を含まない。

決定項
関数従属を示す以下の例で、左側の属性のこと。
ex.)学生番号→氏名(学生番号が決定項)
候補キー
ある行を一意に識別することのできる属性。

ボイスコッド正規形に分解する。

以下の例を考える。

履修
学生番号 科目名 先生
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

前提条件として、業者名はユニークである。

候補キー
業者番号 業者名 商品番号 数量
業者番号 業者名 商品番号 数量

以上のように、この二つの候補キーは、商品番号が重複する重複キーである。

関数従属:
{業者番号、商品番号} → 業者名、数量(業者名は業者番号に部分関数従属する。)
{業者名、 商品番号} → 業者番号、数量(業者番号は業者名に部分関数従属する。)
1.主キーを{業者番号、商品番号}とした場合
業者番号→業者名なる部分関数従属性が成り立つためボイスコッド正規形ではない。
2.主キーを{業者名、商品番号}とした場合
業者名→業者番号なる部分関数従属性が成り立つためボイスコッド正規形ではない。

一方、業者番号→業者名なる部分関数従属を持つにもかかわらず、業者名は{業者名、商品番号}からなるキーの要素であり、上述した「任意のキーの要素である」を満たすため、第3正規形である。

同様に、業者名→業者番号なる部分関数従属を持つにもかかわらず、業者番号は{業者番号、商品番号}からなるキーの要素であり、上述した「任意のキーの要素である」を満たすため、第3正規形である。

なお、業者名、業者番号はともに、候補キーの一部をなす属性であるから、第2正規形の定義「関係Rの主キー以外の属性はいずれも、いかなる候補キーにも完全関数従属である。」を満たす。

上記の表”仕入”は、業者名の変更の際に、更新忘れ等の問題が生じるため、以下のように分割したほうが良い。
この場合は、ボイスコッド正規形となる。

業者
業者番号 業者名
001 業者A
002 業者B
003 業者C
仕入
業者番号 商品番号 数量
001 商品A 1
002 商品A 2
003 商品B 1

データベーススペシャリスト目次へ