| 正規形 | Abbreviation | 定義 |
|---|---|---|
| 第一正規形 | 1NF | ドメインがシンプルであること |
| 第二正規形 | 2NF | 1NFを満たし、全ての非キー属性が各候補キーに完全関数従属していること |
| 第三正規形 | 3NF | 2NFを満たし、全ての非キー属性が各候補キーに推移的関数従属しないこと |
第一正規形¶
リレーショナルデータベースを設計するには、一般的に実体関連モデルを用いてER図を作成し、そこからリレーションスキーマを導出する。得られたリレーションスキーマは、全て第一正規形を満たさなければならない。
第二正規形¶
更新時異状¶
しかし、リレーションスキーマが第1正規形を満たしていても、様々な更新時異状(update anomaly)が発生する可能性がある。
例えば、以下のようなリレーションを考える。「学籍番号」と「科目番号」を主キーとする。
| 学籍番号 | 科目番号 | 科目名 | 成績 |
|---|---|---|---|
| 2501 | CS101 | 計算機科学 | 92 |
| 2501 | CS102 | プログラミング | 85 |
| 2502 | CS101 | 計算機科学 | 88 |
| 2502 | CS103 | データベース | 90 |
- 挿入時異状: 新しい科目「CS104 人工知能概論」を追加したいが、まだ受講者がいないため、挿入できない。
- 削除時異状: (2502, CS103, データベース, 90)を削除すると、科目「データベース」の情報が失われる。
- 修正時異状: 科目名「計算機科学」を「コンピュータサイエンス」に変更したいが、複数の行を修正する必要がある。
関数従属性¶
つまり、が存在する場合、任意のインスタンスとにおいて、の値が同じならば、の値も同じであることを意味する。
正規化¶
第三正規形¶
更新時異状¶
第二正規形を満たしていても、更新時異状が発生する可能性がある。
例えば、以下のようなリレーションを考える。「学籍番号」を主キーとする。
| 学籍番号 | 氏名 | 学部 | キャンパス |
|---|---|---|---|
| 2501 | 山田太郎 | 理工学部 | 小金井 |
| 2502 | 佐藤花子 | 情報学部 | 小金井 |
| 2503 | 鈴木一郎 | 経済学部 | 多摩 |
| 2504 | 田中二郎 | 文学部 | 市ヶ谷 |
| 2505 | 高橋三郎 | 文学部 | 市ヶ谷 |
ここで、学籍番号氏名, 学籍番号学部, 学籍番号キャンパスとする。主キーは学籍番号であるため、このリレーションは第二正規形である。
- 挿入時異状: 新しい学部「データサイエンス学部」ができ、キャンパスが小金井と決定したとする。学籍番号が決まっていないため、挿入できない。
- 削除時異状: 学籍番号2501の学生が退学した場合、(理工学部, 小金井)の情報が失われる。
- 修正時異状: 文学部を多摩キャンパスに移動したとする。複数の行を修正する必要がある。
推移的関数従属性¶
正規化¶
練習¶
下記のリレーションスキーマは第一正規形を満たしているが、第二正規形や第三正規形を満たしていない。問題1から3を解いて、第三正規形に正規化してみよう。同じ職位の場合は、同じ給与であるとする。プロジェクトにおいての社員の仕事時間は、プロジェクト番号と社員番号の組み合わせで一意に決まるとする。
- プロジェクト(プロジェクト番号, プロジェクト名, 社員番号, 社員名, 職位, 給与, 仕事時間)
- リレーションスキーマを完全関数従属性を定義してみよう。
- 定義した完全関数従属性を用いて、リレーションスキーマを第2正規形に正規化してみよう。
- 第2正規形に正規化したリレーションスキーマを用いて、第3正規形に正規化してみよう。