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 成績(学籍番号, 科目番号, 科目名, 成績)において、学籍番号と科目番号の組み合わせが主キーであるとする。次のような完全関数従属性が存在する。

  1. {学籍番号, 科目番号} \(\to\) {成績}
  2. {科目番号} \(\to\) {科目名}

例 7.2 下記のリレーションスキーマでは、完全関数従属性を定義してみよう。

  1. 注文(顧客ID, 商品番号, 商品名, 単価, 数量, 金額)
  2. 成績(学籍番号, 科目番号, 科目名, 成績, 単位数, 担当教員, 判定)
  3. 供給(供給者ID, 商品番号, 在庫数, 所在地, 供給者名, 電話番号)

7.2.3 正規化

定義 7.4 リレーションスキーマ\(\boldsymbol{R}\)第2正規形(2NF, second normal form)であるとは,次の条件を満たすことをいう.

  1. \(\boldsymbol{R}\)は第1正規形である.
  2. \(\boldsymbol{R}\)の全ての非キー属性が,\(\boldsymbol{R}\)の全ての候補キーに完全関数従属している.

例 7.3 成績(学籍番号, 科目番号, 科目名, 成績)

科目名は主キーの真部分集合である{科目番号}に完全従属しているので、リレーション成績は第二正規形ではない。

そこで、科目番号\(\to\)科目名という関数従属を用いて、成績を成績(学籍番号, 科目番号, 成績)と科目(科目番号, 科目名)に分解すると、どちらも第二正規形になる。

例 7.4 下記のリレーションスキーマを第二正規形に正規化してみよう。

  1. 注文(顧客ID, 商品番号, 商品名, 単価, 数量, 金額)
  2. 成績(学籍番号, 科目番号, 科目名, 成績, 単位数, 担当教員, 判定)
  3. 供給(供給者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)であるとは,次の条件を満たすことをいう.

  1. \(\boldsymbol{R}\)は第2正規形である.
  2. \(\boldsymbol{R}\)の全ての非キー属性が,\(\boldsymbol{R}\)の全ての候補キーに推移的関数従属していない.

例 7.6 学生(学籍番号, 氏名, 学部, キャンパス)には、キャンパスが学籍番号に推移的に従属するので、第3正規形ではない。

\(\text{学部} \to \text{キャンパス}\)という関数従属を用いて、学生(学籍番号, 氏名, 学部)と学部(学部, キャンパス)に分解すると、どちらも第3正規形になる。

例 7.7 下記のリレーションスキーマを第3正規形に正規化してみよう。

  1. 社員(社員番号, 氏名, 部署, 勤務地)
  2. 社員(社員番号, 氏名, 職位, 給与)

7.4 練習

下記のリレーションスキーマは第一正規形を満たしているが、第二正規形や第三正規形を満たしていない。問題1から3を解いて、第三正規形に正規化してみよう。同じ職位の場合は、同じ給与であるとする。プロジェクトにおいての社員の仕事時間は、プロジェクト番号と社員番号の組み合わせで一意に決まるとする。

  • プロジェクト(プロジェクト番号, プロジェクト名, 社員番号, 社員名, 職位, 給与, 仕事時間)
  1. リレーションスキーマを完全関数従属性を定義してみよう。
  2. 定義した完全関数従属性を用いて、リレーションスキーマを第2正規形に正規化してみよう。
  3. 第2正規形に正規化したリレーションスキーマを用いて、第3正規形に正規化してみよう。