🐘

データベースの正規化とは

に公開

正規化とは

データベース設計においては、データの冗長性や不整合が発生しないようすることが大切です。例えば、同じデータを複数のテーブルや行に持つ設計では、更新タイミングによってはデータの矛盾が生じる可能性があります。
こうした問題を未然に防ぎ、データの整合性や一貫性を高める手法が 正規化 です。
正規化には第一正規形から第五正規形までの段階がありますが、ここでは基本となる第一正規形から第三正規形までを説明します。

第一正規形

第一正規形の定義は 一つのセルの中には一つの値しか含まない というものです。

第一正規形に違反しているテーブルの例

顧客ID 顧客名 注文商品
C001 田中 太郎 ノートPC, キーボード
C002 佐藤 花子 マウス
C003 鈴木 次郎 モニター, マウス, キーボード

第一正規形に正規化したテーブルの例

  1. 行を注文商品の数だけ増やす
顧客ID 顧客名 注文商品
C001 田中 太郎 ノートPC
C001 田中 太郎 キーボード
C002 佐藤 花子 マウス
C003 鈴木 次郎 モニター
C003 鈴木 次郎 マウス
C003 鈴木 次郎 キーボード
  1. 列を注文商品の数だけ増やす
顧客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