理解しているつもりだったのですが...
「正規化って何?」と聞かれて、第1正規形〜第3正規形をきちんと答えることができませんでした。
そこで、次のような発注伝票を例に「正規化」に再入門してみます。
┌────────────────────┐
│伝票番号:100 日付:20080827 │
│顧客コード:200 顧客名:遠藤 住所:東京都 │
│ │
│┌─────────────┐ │
││商品コード 数量 単価 │ │
│├─────────────┤ │
││300 3 980 │ │
││400 2 500 │ │
││500 5 800 │ │
││600 1 400 │ │
│└─────────────┘ │
└────────────────────┘
第1正規形 : 繰り返し項目を取り除く
先程の発注伝票を1つのテーブルで表すと、次のように{伝票番号,日付,顧客コード,顧客名,住所}には同じ内容が入ります。
このとき、{商品コード, 数量, 単価}を「繰り返し項目」と言い、この「繰り返し項目」を削除することを第1正規化と言います。
伝票番号 |
日付 |
顧客コード |
顧客名 |
住所 |
商品コード |
数量 |
単価 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
300 |
3 |
980 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
400 |
2 |
500 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
500 |
5 |
800 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
600 |
1 |
400 |
今回の例では、主キーが{伝票番号,商品コード}である為、第1正規形は次のようになります。
伝票番号 |
日付 |
顧客コード |
顧客名 |
住所 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
伝票番号 |
商品コード |
数量 |
単価 |
100 |
300 |
3 |
980 |
100 |
400 |
2 |
500 |
100 |
500 |
5 |
800 |
100 |
600 |
1 |
400 |
第2正規形 : 主キーの一部に関数従属する属性を分割
今回の例であれば、伝票明細から、商品コードと単価を別の表へ分割できます。
伝票番号 |
日付 |
顧客コード |
顧客名 |
住所 |
100 |
20080827 |
200 |
遠藤 |
東京都 |
伝票番号 |
商品コード |
数量 |
100 |
300 |
3 |
100 |
400 |
2 |
100 |
500 |
5 |
100 |
600 |
1 |
商品コード |
単価 |
300 |
980 |
400 |
500 |
500 |
800 |
600 |
400 |
第3正規形 : 非キー属性に関数従属する属性を分割
今回の例であれば、伝票テーブルから、{顧客コード, 顧客名, 住所}を別の表へ分割できます。
伝票番号 |
日付 |
顧客コード |
100 |
20080827 |
200 |
伝票番号 |
商品コード |
数量 |
100 |
300 |
3 |
100 |
400 |
2 |
100 |
500 |
5 |
100 |
600 |
1 |
商品コード |
単価 |
300 |
980 |
400 |
500 |
500 |
800 |
600 |
400 |