正規化を行うと、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 | 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 | 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正規化では、キーが複合キーの場合、複合キーを構成する一部の項目によって従属する項目を分離します。
関係[伝票]は、伝票番号と商品コードの組み合わせをキーとしています。商品名と単価は、キーの一部である商品コードに従属します。なので、関係[伝票]と関係[商品]に分離します。
伝票番号 | 日付 | 顧客コード | 顧客名 | 年齢 | 商品コード | 数量 |
---|---|---|---|---|---|---|
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 |
商品コード | 商品名 | 単価 |
---|---|---|
1 | ナス | 150 |
2 | トマト | 100 |
3 | ジャガイモ | 50 |
4 | カボチャ | 200 |
第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 |
商品コード | 商品名 | 単価 |
---|---|---|
1 | ナス | 150 |
2 | トマト | 100 |
3 | ジャガイモ | 50 |
4 | カボチャ | 200 |
顧客コード | 顧客名 | 年齢 |
---|---|---|
1 | 鈴木 | 34 |
2 | 山本 | 29 |
3 | 元木 | 42 |