7 正規化理論
| 正規形 | Abbreviation | 定義 |
|---|---|---|
| 第一正規形 | 1NF | ドメインがシンプルであること |
| 第二正規形 | 2NF | 1NFを満たし、全ての非キー属性が各候補キーに完全関数従属していること |
| 第三正規形 | 3NF | 2NFを満たし、全ての非キー属性が各候補キーに推移的関数従属しないこと |
7.1 第一正規形
リレーショナルデータベースを設計するには、一般的に実体関連モデルを用いてER図を作成し、そこからリレーションスキーマを導出する。得られたリレーションスキーマは、全て第一正規形を満たさなければならない。
定義 7.1 リレーションスキーマ\(\boldsymbol{R}(A_1, A_2, \ldots, A_n)\)が第1正規形(1NF, first normal form)であるとは,任意のドメインがシンプルであることをいう.
シンプルはドメインの元が原子的(atomic),即ち分解不可能(nondecomposable)な値であることを指す.
7.2 第二正規形
7.2.1 更新時異状
しかし、リレーションスキーマが第1正規形を満たしていても、様々な更新時異状(update anomaly)が発生する可能性がある。
例えば、以下のようなリレーションを考える。「学籍番号」と「科目番号」を主キーとする。
| 学籍番号 | 科目番号 | 科目名 | 成績 |
|---|---|---|---|
| 2501 | CS101 | 計算機科学 | 92 |
| 2501 | CS102 | プログラミング | 85 |
| 2502 | CS101 | 計算機科学 | 88 |
| 2502 | CS103 | データベース | 90 |
- 挿入時異状: 新しい科目「CS104 人工知能概論」を追加したいが、まだ受講者がいないため、挿入できない。
- 削除時異状: (2502, CS103, データベース, 90)を削除すると、科目「データベース」の情報が失われる。
- 修正時異状: 科目名「計算機科学」を「コンピュータサイエンス」に変更したいが、複数の行を修正する必要がある。
7.2.2 関数従属性
定義 7.2 リレーションスキーマ\(\boldsymbol{R}(X, Y, Z)\)において、関数従属性(functional dependency)\(X \to Y\)が存在するとは、\(\boldsymbol{R}\)の任意のインスタンス\(R\)に対して、次の条件が成り立つことをいう。
\[ \forall r_1, r_2 \in R, \quad (r_1[X] = r_2[X] \implies r_1[Y] = r_2[Y]) \]
つまり、\(X \to Y\)が存在する場合、任意のインスタンス\(r_1\)と\(r_2\)において、\(X\)の値が同じならば、\(Y\)の値も同じであることを意味する。
定義 7.3 関数従属性\(X \to Y\)において、\(X\)の任意の真部分集合\(X'\)に対して、\(X' \not\to Y\)が成り立つとき、\(Y\)は\(X\)に完全関数従属しているという。
例 7.1 成績(学籍番号, 科目番号, 科目名, 成績)において、学籍番号と科目番号の組み合わせが主キーであるとする。次のような完全関数従属性が存在する。
- {学籍番号, 科目番号} \(\to\) {成績}
- {科目番号} \(\to\) {科目名}
例 7.2 下記のリレーションスキーマでは、完全関数従属性を定義してみよう。
- 注文(顧客ID, 商品番号, 商品名, 単価, 数量, 金額)
- 成績(学籍番号, 科目番号, 科目名, 成績, 単位数, 担当教員, 判定)
- 供給(供給者ID, 商品番号, 在庫数, 所在地, 供給者名, 電話番号)
7.2.3 正規化
定義 7.4 リレーションスキーマ\(\boldsymbol{R}\)が第2正規形(2NF, second normal form)であるとは,次の条件を満たすことをいう.
- \(\boldsymbol{R}\)は第1正規形である.
- \(\boldsymbol{R}\)の全ての非キー属性が,\(\boldsymbol{R}\)の全ての候補キーに完全関数従属している.
例 7.3 成績(学籍番号, 科目番号, 科目名, 成績)
科目名は主キーの真部分集合である{科目番号}に完全従属しているので、リレーション成績は第二正規形ではない。
そこで、科目番号\(\to\)科目名という関数従属を用いて、成績を成績(学籍番号, 科目番号, 成績)と科目(科目番号, 科目名)に分解すると、どちらも第二正規形になる。
例 7.4 下記のリレーションスキーマを第二正規形に正規化してみよう。
- 注文(顧客ID, 商品番号, 商品名, 単価, 数量, 金額)
- 成績(学籍番号, 科目番号, 科目名, 成績, 単位数, 担当教員, 判定)
- 供給(供給者ID, 商品番号, 在庫数, 所在地, 供給者名, 電話番号)
7.3 第三正規形
7.3.1 更新時異状
第二正規形を満たしていても、更新時異状が発生する可能性がある。
例えば、以下のようなリレーションを考える。「学籍番号」を主キーとする。
| 学籍番号 | 氏名 | 学部 | キャンパス |
|---|---|---|---|
| 2501 | 山田太郎 | 理工学部 | 小金井 |
| 2502 | 佐藤花子 | 情報学部 | 小金井 |
| 2503 | 鈴木一郎 | 経済学部 | 多摩 |
| 2504 | 田中二郎 | 文学部 | 市ヶ谷 |
| 2505 | 高橋三郎 | 文学部 | 市ヶ谷 |
ここで、学籍番号\(\to\)氏名, 学籍番号\(\to\)学部, 学籍番号\(\to\)キャンパスとする。主キーは学籍番号であるため、このリレーションは第二正規形である。
- 挿入時異状: 新しい学部「データサイエンス学部」ができ、キャンパスが小金井と決定したとする。学籍番号が決まっていないため、挿入できない。
- 削除時異状: 学籍番号2501の学生が退学した場合、(理工学部, 小金井)の情報が失われる。
- 修正時異状: 文学部を多摩キャンパスに移動したとする。複数の行を修正する必要がある。
7.3.2 推移的関数従属性
定義 7.5 リレーションスキーマ\(\boldsymbol{R}(X, Y, Z)\)において、\(X \to Y\)と\(Y \to Z\)が存在するとき、\(X \to Z\)が成立する。
例 7.5 学生(学籍番号, 氏名, 学部, キャンパス)には
\[ \text{学籍番号} \to \text{学部}\\ \text{学部} \to \text{キャンパス} \]
があるため、推移的関数従属性
\[ \text{学籍番号} \to \text{キャンパス} \]
が存在する。
7.3.3 正規化
定義 7.6 リレーションスキーマ\(\boldsymbol{R}\)が第3正規形(3NF, third normal form)であるとは,次の条件を満たすことをいう.
- \(\boldsymbol{R}\)は第2正規形である.
- \(\boldsymbol{R}\)の全ての非キー属性が,\(\boldsymbol{R}\)の全ての候補キーに推移的関数従属していない.
例 7.6 学生(学籍番号, 氏名, 学部, キャンパス)には、キャンパスが学籍番号に推移的に従属するので、第3正規形ではない。
\(\text{学部} \to \text{キャンパス}\)という関数従属を用いて、学生(学籍番号, 氏名, 学部)と学部(学部, キャンパス)に分解すると、どちらも第3正規形になる。
例 7.7 下記のリレーションスキーマを第3正規形に正規化してみよう。
- 社員(社員番号, 氏名, 部署, 勤務地)
- 社員(社員番号, 氏名, 職位, 給与)
7.4 練習
下記のリレーションスキーマは第一正規形を満たしているが、第二正規形や第三正規形を満たしていない。問題1から3を解いて、第三正規形に正規化してみよう。同じ職位の場合は、同じ給与であるとする。プロジェクトにおいての社員の仕事時間は、プロジェクト番号と社員番号の組み合わせで一意に決まるとする。
- プロジェクト(プロジェクト番号, プロジェクト名, 社員番号, 社員名, 職位, 給与, 仕事時間)
- リレーションスキーマを完全関数従属性を定義してみよう。
- 定義した完全関数従属性を用いて、リレーションスキーマを第2正規形に正規化してみよう。
- 第2正規形に正規化したリレーションスキーマを用いて、第3正規形に正規化してみよう。