データベースの正規化とは
正規化とは
データベース設計においては、データの冗長性や不整合が発生しないようすることが大切です。例えば、同じデータを複数のテーブルや行に持つ設計では、更新タイミングによってはデータの矛盾が生じる可能性があります。
こうした問題を未然に防ぎ、データの整合性や一貫性を高める手法が 正規化 です。
正規化には第一正規形から第五正規形までの段階がありますが、ここでは基本となる第一正規形から第三正規形までを説明します。
第一正規形
第一正規形の定義は 一つのセルの中には一つの値しか含まない というものです。
第一正規形に違反しているテーブルの例
顧客ID | 顧客名 | 注文商品 |
---|---|---|
C001 | 田中 太郎 | ノートPC, キーボード |
C002 | 佐藤 花子 | マウス |
C003 | 鈴木 次郎 | モニター, マウス, キーボード |
第一正規形に正規化したテーブルの例
- 行を注文商品の数だけ増やす
顧客ID | 顧客名 | 注文商品 |
---|---|---|
C001 | 田中 太郎 | ノートPC |
C001 | 田中 太郎 | キーボード |
C002 | 佐藤 花子 | マウス |
C003 | 鈴木 次郎 | モニター |
C003 | 鈴木 次郎 | マウス |
C003 | 鈴木 次郎 | キーボード |
- 列を注文商品の数だけ増やす
顧客ID | 顧客名 | 注文商品1 | 注文商品2 | 注文商品3 |
---|---|---|---|---|
C001 | 田中 太郎 | ノートPC | キーボード | |
C002 | 佐藤 花子 | マウス | ||
C003 | 鈴木 次郎 | モニター | マウス | キーボード |
第二正規形
第二正規形の定義は 部分関数従属がないこと というものです。
関数従属性とは
y = 5xという関数があります。例えば、x = 1の場合、y = 5とxの値に対して、yの値が一つに決まります。
このとき、yはxに従属するといいます。
部分関数従属とは
主キーの一部の列に対して、関数従属性があることをいいます。
下のテーブルの場合、主キーは{大学コード, 学籍番号}です。
部分関数従属しているカラム
大学名というカラムに注目すると、大学コードが決まれば大学名が決まることがわかります。
よって大学名は大学コードに関数従属していることがわかると思います。
また、大学コードは主キーの一部分であるため、大学名と大学コードの関係は部分関数従属と言えます。
第二正規形になっていない学生テーブル
学生テーブル
大学コード | 大学名 | 学籍番号 | 氏名 | 年齢 | 学部コード | 学部名 |
---|---|---|---|---|---|---|
U001 | 愛知大学 | S001 | 田中 太郎 | 20 | F01 | 法学部 |
U001 | 愛知大学 | S002 | 鈴木 花子 | 21 | F02 | 経済学部 |
U002 | 名城大学 | S003 | 佐藤 次郎 | 22 | F01 | 法学部 |
U002 | 名城大学 | S004 | 高橋 美咲 | 20 | F03 | 理学部 |
第二正規化前の各カラムの従属関係
属性 | 従属先 | 説明 |
---|---|---|
大学名 | 大学コード | 大学コード → 大学名(完全従属) |
氏名 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
年齢 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
学部コード | {大学コード, 学籍番号} | 主キー全体に完全従属 |
学部名 | 学部コード | 学部コード → 学部名(推移的従属)(このあと説明します) |
第二正規形に正規化したテーブル
学生テーブル
大学コード | 学籍番号 | 氏名 | 年齢 | 学部コード | 学部名 |
---|---|---|---|---|---|
U001 | S001 | 田中 太郎 | 20 | F01 | 法学部 |
U001 | S002 | 鈴木 花子 | 21 | F02 | 経済学部 |
U002 | S003 | 佐藤 次郎 | 22 | F01 | 法学部 |
U002 | S004 | 高橋 美咲 | 20 | F03 | 理学部 |
大学テーブル
大学コード | 大学名 |
---|---|
U001 | 愛知大学 |
U002 | 名城大学 |
第二正規化後の学生テーブルの各カラムの従属関係
属性 | 従属先 | 説明 |
---|---|---|
氏名 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
年齢 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
学部コード | {大学コード, 学籍番号} | 主キー全体に完全従属 |
学部名 | 学部コード | 学部コード → 学部名(推移的従属)(このあと説明します) |
第三正規形
第三正規形の定義は 推移的関数従属がないこと というものです。
推移的関数従属とは
第二正規化後の学部コードは主キーに完全従属しています。
次に、学部名に注目してください。学部名は学部コードに従属しています。
よって従属の流れは以下のようになります。この従属関係を推移的関数従属といいます。
{大学コード, 学籍番号} -> 学部コード -> 学部名
第三正規形に正規化したテーブル
学生テーブル
大学コード | 学籍番号 | 氏名 | 年齢 | 学部コード |
---|---|---|---|---|
U001 | S001 | 田中 太郎 | 20 | F01 |
U001 | S002 | 鈴木 花子 | 21 | F02 |
U002 | S003 | 佐藤 次郎 | 22 | F01 |
U002 | S004 | 高橋 美咲 | 20 | F03 |
大学テーブル
大学コード | 大学名 |
---|---|
U001 | 愛知大学 |
U002 | 名城大学 |
学部テーブル
学部コード | 学部名 |
---|---|
F01 | 法学部 |
F02 | 経済学部 |
F03 | 理学部 |
第三正規化後の学生テーブルの各カラムの従属関係
属性 | 従属先 | 説明 |
---|---|---|
氏名 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
年齢 | {大学コード, 学籍番号} | 主キー全体に完全従属 |
学部コード | {大学コード, 学籍番号} | 主キー全体に完全従属 |
Discussion