正規化はデータに矛盾や重複が生じないように表を最適化することです。
流れとしては下記となります。
非正規形
// 正規化されていない繰り返し部分を持つ表
第1正規形
// 繰り返し部分を分離させて、独立したレコードとした表
第2正規形
// 部分関数従属している列を切り出したカタチの表
第3正規形
// 主キー以外の列に関数従属している列を切り出したカタチの表
正規化の目的は、データや矛盾に重複を生じさせないこと。
関係データベースでは、第3正規形の表を管理します。
非正規系の表は繰り返し部分を持っている
例えば上記の請求書があるとします。
ちゃんとカラムを設計できているかは別として例えば下記のような表になるとします。
請求書No | 取引先名 | 品名 | 単価 | 数量 | 単位 | 金額 |
---|---|---|---|---|---|---|
1 | 太郎商事 | ペロペロキャンディ | 100 | 1 | 個 | 400 |
2 | 田中悪代官 | もも | 200 | 2 | 個 | 700 |
別のレコードがあるとします。
品名 | 単価 | 数量 | 単位 | 金額 | 品名 | 単価 | 数量 | 単位 | 金額 |
---|---|---|---|---|---|---|---|---|---|
すもも | 400 | 1 | 個 | 400 | アイス | 500 | 1 | 個 | 500 |
たこ | 200 | 2 | 個 | 400 |
各レコードの長さがバラバラで、2次元の表になっていません。これが、非正規系の表です。
関係データベースでは、バラバラなレコードは表として管理することができません。
第1正規系の表は繰り返しを除いたカタチ
非正規系の表から、正規化を行うと
請求書No | 取引先名 | 品名 | 単価 | 数量 | 単位 | 金額 |
---|---|---|---|---|---|---|
1 | 太郎商事 | ペロペロキャンディ | 400 | 1 | 個 | 400 |
1 | 太郎商事 | すもも | 400 | 1 | 個 | 400 |
1 | 太郎商事 | アイス | 500 | 1 | 個 | 500 |
2 | 田中悪代官 | もも | 200 | 2 | 個 | 400 |
2 | 田中悪代官 | たこ | 200 | 2 | 個 | 400 |
これで表が出来上がりました
関数従属と部分関数従属
ちょっと難しい言葉ですが、表の中における列と列との関係を表したものです。
主キーに対して、この項目がどんな関係にあるかを表す言葉だと思えば良いらしいです。
主キー
社員番号(主キー) | 名前 | 部署 |
---|---|---|
20000 | 田代 | 営業 |
20001 | 山本 | 開発 |
「社員番号」が決まると「名前」が決まる「部署」が決まる
主キー(複合キー)
学年(複合キー) | 組(複合キー) | 出席番号(複合キー) | 名前 |
---|---|---|---|
6 | 3 | 001 | 田代 |
6 | 3 | 002 | 岡本 |
「学年」「組」「出席番号」が決まると「名前」が決まる
主キーが決まれば、列の値が一意に定まる関係のことを関数従属と呼びます。
「名前」は「社員番号」に関数従属している、などと使います。
複合キーの一部の項目だけで、列の値が一意に定まる関係
受注No | 受注日付 | 顧客コード | 顧客名称 | 商品コード | 商品名 | 単価 | 数量 |
---|---|---|---|---|---|---|---|
1011 | 2010/11/12 | C010 | ほげ | B101 | 紙ファイル | 50 | 12 |
1011 | 2010/11/12 | C010 | ほげ | B102 | 3色ボールペン | 300 | 8 |
受注Noが決まれば、3つの列が決まり
商品コードが決まれば2つの列が決まる
主キーの一部分に対して関係従属する項目なので、このような関係を部分関係従属と呼びます。
まとめ
第二正規系と第三正規系は次でまとめます。