データベースの正規化手順

正規化を行うと、DB上でデータの一貫性を維持することができます。また、入力の手間を削減したり、誤った入力を防止させる効果もあります。ここでは、伝票の関係を例に第3正規化まで行っていきます。

例に利用する関係

関係[伝票]
伝票番号 日付 顧客コード 顧客名(年齢) 商品コード 商品名 単価 数量 小計
1 2014/10/1 2 山本(29) 2 トマト 100 2 200
4 カボチャ 200 1 200
2 2014/10/3 3 元木(42) 3 ジャガイモ 50 4 200
3 2014/10/5 1 鈴木(34) 1 ナス 150 2 300
2 トマト 100 1 100

第1正規化

第1正規化では、繰り返し項目をそれぞれ別レコードとして独立させます。
関係[伝票]を第1正規化してみます。

関係[伝票] 第1正規形
伝票番号 日付 顧客コード 顧客名(年齢) 商品コード 商品名 単価 数量 小計
1 2014/10/1 2 山本(29) 2 トマト 100 2 200
1 2014/10/1 2 山本(29) 4 カボチャ 200 1 200
2 2014/10/3 3 元木(42) 3 ジャガイモ 50 4 200
3 2014/10/5 1 鈴木(34) 1 ナス 150 2 300
3 2014/10/5 1 鈴木(34) 2 トマト 100 1 100

※DBで管理しやすくするために次の作業も行っておきます。

  • 1つの項目に1つの値が格納されるようにする。
  • 計算で求められる項目を削除する。

今回の例でいうと、「顧客名(年齢)」を「顧客名」「年齢」に分離します。
また、小計は「単価」と「数量」から計算できるので削除します。

関係[伝票] 第1正規形
伝票番号 日付 顧客コード 顧客名 年齢 商品コード 商品名 単価 数量
1 2014/10/1 2 山本 29 2 トマト 100 2
1 2014/10/1 2 山本 29 4 カボチャ 200 1
2 2014/10/3 3 元木 42 3 ジャガイモ 50 4
3 2014/10/5 1 鈴木 34 1 ナス 150 2
3 2014/10/5 1 鈴木 34 2 トマト 100 1

第2正規化

第2正規化では、キーが複合キーの場合、複合キーを構成する一部の項目によって従属する項目を分離します。

関係[伝票]は、伝票番号と商品コードの組み合わせをキーとしています。商品名と単価は、キーの一部である商品コードに従属します。なので、関係[伝票]と関係[商品]に分離します。

関係[伝票] 第2正規形
伝票番号 日付 顧客コード 顧客名 年齢 商品コード 数量
1 2014/10/1 2 山本 29 2 2
1 2014/10/1 2 山本 29 4 1
2 2014/10/3 3 元木 42 3 4
3 2014/10/5 1 鈴木 34 1 2
3 2014/10/5 1 鈴木 34 2 1
関係[商品] 第2正規形
商品コード 商品名 単価
1 ナス 150
2 トマト 100
3 ジャガイモ 50
4 カボチャ 200

第3正規化

第3正規化では、主キーとなる項目以外の項目によって従属する項目を分離します。

顧客名と年齢は、非キー属性である顧客コードに従属します。なので、関係[伝票]と関係[顧客]に分離します。

関係[伝票] 第3正規形
伝票番号 日付 顧客コード 商品コード 数量
1 2014/10/1 2 2 2
1 2014/10/1 2 4 1
2 2014/10/3 3 3 4
3 2014/10/5 1 1 2
3 2014/10/5 1 2 1
関係[商品] 第3正規形
商品コード 商品名 単価
1 ナス 150
2 トマト 100
3 ジャガイモ 50
4 カボチャ 200
関係[顧客] 第3正規形
顧客コード 顧客名 年齢
1 鈴木 34
2 山本 29
3 元木 42
わくわくBank.
フリーランスのエンジニアとして活動してます。ここでは、ソフトウェア開発で必要とされる技術、用語、概念を整理しています。

設計に関連する書籍 (Amazon)