データベーススペシャリストを勉強するにあたって、ボイスコッド正規形、第4正規形、第5正規形の理解に苦しんだので、自分なりにまとめておきたいと思います。
第1正規形
まず、非正規形というのは繰り返し項目が含まれているテーブルのことです。
下の表のように、商品番号、商品名などの商品明細部分に複数値が含まれており繰り返し項目になっていることが分かります。
伝票番号 | 商品番号 | 商品名 |
1 | S001 S002 F001 | 消しゴム 鉛筆 パン |
2 | S002 F002 | 鉛筆 カップ麵 |
第1正規形はすべての属性が単一値になっているテーブルのことです。
つまり上記の表から繰り返し項目を削除し以下の表にすればよいことになります。
伝票番号 | 商品番号 | 商品名 |
1 | S001 | 消しゴム |
1 | S002 | 鉛筆 |
1 | F001 | パン |
2 | S002 | 鉛筆 |
2 | F002 | カップ麺 |
第2正規形
第2正規形の条件は第1正規形であること、部分関数従属が含まれていないことです。
部分関数従属とは、候補キーの一部から非キー属性が導かれる場合になります。
反対に完全関数従属とは、候補キーすべてから非キー属性が導かれることを言います。
ここで候補キーとは、一行を特定できる最小の組のことです。主キーも候補キーの一つです。
また、非キー属性とは、候補キー以外の属性のことです。
表2の場合だと、候補キーは{伝票番号、商品番号}となりますが、商品名は候補キーの一部である商品番号から導かれてしまいます。
つまり部分関数従属を含んでいます。
部分関数従属を排除すると、以下のようになります。
売上明細のテーブルと商品テーブルに分割することで、部分関数従属をテーブルから排除しました。
伝票番号 | 商品番号 |
1 | S001 |
1 | S002 |
1 | F001 |
2 | S002 |
2 | F002 |
商品番号 | 商品名 |
S001 | 消しゴム |
S002 | 鉛筆 |
F001 | パン |
F002 | カップ麺 |
ちなみに部分関数従属は、候補キーが複合キーの場合発生するので、候補キーが単一属性なら発生しません。
第3正規形
第3正規形の条件は、第2正規形であり推移的関数従属を含まないことです。
推移的関数従属とは、非キー属性から非キー属性が導かれるということです。
主キーX→非キーY→非キーZと推移的に導かれるので推移的従属ということです。
伝票番号 | 商品番号 | 顧客番号 | 顧客名 |
1 | S001 | C1 | 田中 |
1 | S002 | C1 | 田中 |
1 | F001 | C1 | 田中 |
2 | S002 | C2 | 佐藤 |
2 | F002 | C2 | 佐藤 |
例えば、上記のように売上明細の表に、顧客番号と顧客名を含んでいたとします。
主キーは{伝票番号、商品番号}ですが、顧客名は、非キー属性の顧客番号から決定され、
{伝票番号、商品番号}→{顧客番号}→{顧客名}と推移的従属になっています。
推移的関数従属を排除すると、以下のようになります。
売上明細テーブルと顧客テーブルに分割することで、推移的従属がテーブルから排除できました。
伝票番号 | 商品番号 |
1 | S001 |
1 | S002 |
1 | F001 |
2 | S002 |
2 | F002 |
顧客番号 | 顧客 |
C1 | 田中 |
C2 | 佐藤 |
ボイスコッド正規形(第3.5正規形)
ボイスコッド正規形とはすべての関係が自明な関数従属性であるか、決定項がスーパーキーとなるテーブルのことです。
ここで自明な関数従属性とは、{伝票番号、商品番号}→伝票番号、{伝票番号、商品番号}→商品番号のように部分集合に対して当たり前に成立する関係のことです。
また、決定項とはX→Yの関係が成立するとき決定する側のXのことです。
スーパーキーとは、一行を特定できる組のことです。極小でなくてよいので候補キーもスーパーキーに含みます。
学生 | 科目 | 講師 |
田中 | 数学 | 数学太郎 |
佐藤 | 数学 | 数学次郎 |
鈴木 | 数学 | 数学次郎 |
鈴木 | 国語 | 国語花子 |
この表の条件として学生は複数科目を受講でき、講師は1つの科目を担当するが、1つの科目には複数の講師がいるものとします。
表6の場合、主キーは{学生、科目}となりますが、講師は担当する科目が決まっているので
{講師}→{科目}の関係が成立し決定項がスーパーキーでない関係を含んでいます。
これを解消すると、以下のようになります。
受講テーブルと講師テーブルに分割することでボイスコッド正規形とすることができます。
学生 | 科目 |
田中 | 数学 |
佐藤 | 数学 |
鈴木 | 数学 |
鈴木 | 国語 |
講師 | 科目 |
数学太郎 | 数学 |
数学次郎 | 数学 |
国語花子 | 国語 |
しかしボイスコッド正規形では、分解により一部失われるデータが発生する場合があります。
上記の例だと、{学生、科目}→講師の情報が失われているので田中が数学を数学太郎か数学次郎のどちらの講師から受講していたのか分からなくなってしまっています。
第4正規形
第4正規形とは、ボイスコッド正規形であり複数の多値従属性を含まないテーブルのことです。
ここで多値従属性とは、属性Xが1つ決まれば、属性Yが1つ以上決まる性質のことです。
社員 | 趣味 | 資格 |
田中 | 映画鑑賞 | 基本情報 |
田中 | 映画鑑賞 | 応用情報 |
田中 | 読書 | 基本情報 |
田中 | 読書 | 応用情報 |
表8では、{社員、趣味、資格}を主キーとしていますが、{社員}が決まると{趣味}と{資格}の2つの2つの属性がそれぞれ複数決定されることとなります。
複数の多値従属性が存在しているので、これを排除すれば第4正規形となります。
社員 | 趣味 |
田中 | 映画鑑賞 |
田中 | 読書 |
社員 | 資格 |
田中 | 基本情報 |
田中 | 応用情報 |
第5正規形
第5正規形とは、ボイスコッド正規形であり結合従属性を含まないテーブルのことです。
ここで結合従属性とは、多値従属性が2つに分解できるのに対してそれ以上に分解できる場合のことです。
支店 | 在庫商品 | メーカー |
東京 | PC | A社 |
東京 | PC | B社 |
東京 | エアコン | A社 |
大阪 | PC | A社 |
表9の場合、{支店}→{在庫商品}、{支店}→{メーカー}、{在庫商品}→{メーカー}と3つの関係を含んでいるので3分解可能になります。
支店 | 在庫商品 |
東京 | PC |
東京 | エアコン |
大阪 | PC |
支店 | 仕入れ先 |
東京 | A社 |
東京 | B社 |
大阪 | A社 |
商品 | メーカー |
PC | A社 |
PC | B社 |
エアコン | A社 |
このように分解することで、これ以上複数個の関係に分解できないので第5正規形となります。
まとめ
今回は、第1正規化~第5正規化の例をまとめました。
正直、ボイスコッド正規形、第4正規形、第5正規形は初めて知りましたがあまり業務での使用頻度は多くなさそうです。
参考文献
データベーススペシャリスト2020年版 ITのプロ46著 翔泳社
コメント