DBの正規化とは
DBで扱うデータの冗長性を排除し、独立性を高めることです。これにより、DBのメンテナンスが容易になります。
しかし、きちんとしたルールに基づいて正規化を行わなければ整合性や一貫性を確保できなくなります。
正規形のざっくりとした説明
・非正規形
1レコード内に繰り返し項目を持っている。データベースに格納して、SQLで操作して...という処理ができない。
・第1正規形
キーを設定し、テーブルの繰り返し項目を取り除く。
・第2正規形
部分関数従属性を別テーブルに分離。
・第3正規形
推移関数従属性を別テーブルに分離。
非正規形
以下のような伝票テーブルがあったとします。(マークダウンで書けなかったので、Excelで作ったやつのスクショです。)
1レコードの中に商品コード、商品名、単価、数量が複数入力されています。これが繰り返し項目です。
1レコードの中にデータが混在しているため、MysqlなどのRDBMSではこのテーブルを管理することができません。
第1正規形
繰り返し項目を排除し、伝票番号と商品コードごとに1レコードとします。これが第1正規形です。
レコード数は多くなりますが、伝票番号と商品コードを主キーとして伝票を一意に表すことができます。
伝票番号 | 担当者ID | 担当者 | 商品コード | 商品名 | 単価 | 数量 |
---|---|---|---|---|---|---|
1 | 001 | 田中 | A1 | 机 | 10000 | 2 |
1 | 001 | 田中 | B1 | 椅子 | 20000 | 3 |
1 | 001 | 田中 | C1 | 本棚 | 5000 | 4 |
2 | 002 | 鈴木 | A1 | 机 | 10000 | 2 |
2 | 002 | 鈴木 | D1 | テレビ | 50000 | 1 |
第2正規形
部分従属性を無くすことで、テーブルを第2正規形にすることができます。
部分従属性とは、主キー(今回の場合は伝票番号と商品ID)の一部からレコードを特定できる事です。
第1正規形の伝票テーブルを見ると、商品IDから商品は特定できることがわかります。
そのため、伝票テーブルは以下のように伝票テーブルと商品テーブルに分けることができます。
・伝票テーブル(商品名カラムと単価カラムは商品テーブルに分離)
伝票番号 | 担当者ID | 担当者 | 商品コード | 数量 |
---|---|---|---|---|
1 | 001 | 田中 | A1 | 2 |
1 | 001 | 田中 | B1 | 3 |
1 | 001 | 田中 | C1 | 4 |
2 | 002 | 鈴木 | A1 | 2 |
2 | 002 | 鈴木 | D1 | 1 |
・商品テーブル(New!)
商品コード | 商品名 | 単価 |
---|---|---|
A1 | 机 | 10000 |
B1 | 椅子 | 20000 |
C1 | 本棚 | 5000 |
A1 | 机 | 10000 |
D1 | テレビ | 50000 |
第3正規形
推移的従属性を無くすことで、テーブルを第3正規形にすることができます。
推移的従属性とは、主キー以外からレコードを特定できる事です。
第2正規形の伝票テーブルを見ると、担当者IDから担当者は特定できることがわかります。
そのため、第3正規化を行うことで、以下のように伝票テーブル、商品テーブル、社員テーブルに分けることができます。
・伝票テーブル(担当者カラムは社員テーブルに分離)
伝票番号 | 担当者ID | 商品コード | 数量 |
---|---|---|---|
1 | 001 | A1 | 2 |
1 | 001 | B1 | 3 |
1 | 001 | C1 | 4 |
2 | 002 | A1 | 2 |
2 | 002 | D1 | 1 |
・社員テーブル(New!)
担当者ID | 担当者 |
---|---|
001 | 田中 |
001 | 田中 |
001 | 田中 |
002 | 鈴木 |
002 | 鈴木 |
・商品テーブル
商品コード | 商品名 | 単価 |
---|---|---|
A1 | 机 | 10000 |
B1 | 椅子 | 20000 |
C1 | 本棚 | 5000 |
A1 | 机 | 10000 |
D1 | テレビ | 50000 |