はじめに
本記事は第4正規化について自分の理解をまとめたものです。いままで知識としては知っていたものの、あまりきちんと理解できてなかったような気がするので復習のつもりでまとめました。
第2〜ボイスコッド正規化までのおさらい
まず、ボイスコッド正規化までを簡単にまとめます(第1正規化はRDBの条件みたいなものなので除く)。ボイスコッド正規化までテーブルの属性の関数従属をテーブル分割によってなくしていく作業です。
関数従属と正規化
関数従属の説明として以下の学生とテストの点数についてのテーブルに付いて考えてみます。
- 学籍番号は生徒を一意に指定できる番号です。
- 生徒は同じ教科のテストを複数回受けることはできません
- 各教科ごとに複数の担当教員がおり、教員は複数の教科を担当することができません
- 成績はテストの点数によって(100~80がA, 79~60がBのように)決まります
学籍番号* | 教科* | 氏名 | 教員ID | 教員名 |
---|---|---|---|---|
1 | 数学 | 山田太郎 | 001 | 本田 |
2 | 国語 | 田中花子 | 002 | 三井 |
... |
例えば、学籍番号が決まると一意に生徒の氏名も決定できます。
このようにある属性A(これは複数の属性の集合でも良い)から属性Bが一意に決定することができるとき「BがAに関数従属する」と言い、A→Bと書きます。
上記に置いて、*マークがついてる候補キーに着目して、正規化を分類します。
- 第2正規化は、候補キーの一部から候補キー以外の関数従属をなくす作業です。
学籍番号→氏名 - 第3正規化は候補キー以外から候補キー以外への関数従属をなくす作業です。
教員ID→教員名 - ボイスコッド正規化は、候補キー以外から候補キーへの関数従属をなくす作業です。
教員ID→教科
多値従属性
第4正規化は関数従属性に関する正規化ではありません。多値従属性に関する正規化です。
多値従とは
まずwikiに載っている定義を引っ張ってみます。
R を関係とし、A, B, C を、R の属性集合の任意の部分集合とする。 R のある(A値, C値)対に対応するB値の集合がA値だけに依存し、C値には独立かつそのときに限り、B は A に多値従属している
何言ってるかイマイチわかりません。ここでRはリレーションのことでテーブルと思って良いです。下記のようなテーブルがあったとしましょう。
A | B | C |
---|---|---|
a | b | c |
... |
このとき、B列に入る値が、Cに列の値には無関係であるがAの値には依存しているときBはAに多値従属していると言います。ここで重要なのは依存しているだけであって関数従属しているわけではないということです。
関数従属であればAの値に対して一意にBの値が決まります。しかし多値従属の場合は、Aの値が決まるとBの取りうる値が制限されます。(Bの取れる値の集合が決まる)
例えば以下のように、大学の授業、講師、参考図書の対応テーブルが合ったとしましょう。
授業 * | 講師 * | 参考図書 * |
---|---|---|
力学 | 湯川 | 物理数学基礎 |
力学 | 湯川 | 力学入門 |
力学 | 江崎 | 物理数学基礎 |
力学 | 江崎 | 力学入門 |
物理数学 | 湯川 | 物理数学基礎 |
物理数学 | 益川 | 物理数学基礎 |
テーブルの見方を説明すると、力学については湯川と江崎の2講座開講されます。力学の授業では、「力学入門」と「物理数学」が参考図書になっています。物理数学も2講座開講されており、参考図書は「物理数学基礎」です。(物理数学で習ったことが力学でも使えるように力学でも「物理数学基礎」が参考図書が選択されています)
多値従属性は{A,C}という属性を選んだときにBとCが独立でBがAに依存している関係性のことでした。
{授業, 講師}と{参考図書}を見てみましょう。講師と参考図の関係について考えます。
参考図書はどの講師を選んだとしても、{物理数学基礎, 力学入門}の集合から選ばれています。一方、物理数学の授業を選択すると、参考図書は{物理数学基礎}のみの集合から選ばれます。参考図書の集合が授業の値に依存しています。
よって、参考図書は授業に多値従属していると言えます。
第4正規形
第4正規形は、候補キー以外からの多値従属がないものを指します。
先程の例の候補キーは{授業, 更新, 参考図書}なので、授業 --> 参考図書の多値従属は第4正規形に反しています。
第4正規化
では上記テーブルを正規化してみましょう。第4正規化する場合、もう1つの多値従属を見つける必要があります。
これは多値従属の性質から簡単に見つけることができます。あるリレーションRの{A,B,C}という属性があるとします。
ここでA --> Bの多値従属があるならば、A --> {R-B}(A --> C)が成り立つからです。(要証明)
よって、授業 --> 講師の多値従属が存在します。
授業から講師,参考図書の2つの多値従属が存在するので授業を共通キーとしてテーブルを分解します。
授業 | 講師 |
---|---|
力学 | 湯川 |
力学 | 江崎 |
電磁気学 | 湯川 |
電磁気学 | 益川 |
授業 | 参考図書 |
---|---|
力学 | 力学入門 |
力学 | 物理数学 |
電磁気学 | 物理数学 |
これで第4正規化が完了です。2つのテーブルを授業をキーに結合すると元のテーブルになることが確認できます。