end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

正規化に再入門

理解しているつもりだったのですが...
「正規化って何?」と聞かれて、第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
顧客コード 顧客名 住所
200 遠藤 東京都
伝票番号 商品コード 数量
100 300 3
100 400 2
100 500 5
100 600 1
商品コード 単価
300 980
400 500
500 800
600 400