データベースの正規化(normalization) とは、データベースの冗長性を減らし、照時の矛盾を
減らすことをいう。
一般的に、正規化は第3正規形まで行う。
第3正規形まで正規化することによって、冗長性のないデータ項目のグループが作れるが、
処理効率を考えると必ずしも良いとはいえない。
・第1正規化
繰り返しデータをレコードとして、独立させること。
・第2正規化
主キーの一部だけから特定できる項目を別の表にすること。
主キー(primary key) とは、その項目を選び出すとその行(横全部)が
一意に決まる列を言う。
・第3正規化
主キー以外の項目で特定できる項目を別の表にすること。
例)
次の受注表を正規化する
┌───┬─────┬───┬──┬──┬────┬────┐
│受注No│ 受注日 │受注先│商品│数量│ 単価 │合計金額│
┝━━━┿━━━━━┿━━━┿━━┿━━┿━━━━┿━━━━┥
│ │ │ │ S │ 3│ 1,000│ │
│ 1 │00/10/01 │ A │ │ │ │ 4,900│
│ │ │ │ T │ 2│ 950│ │
├───┼─────┼───┼──┼──┼────┼────┤
│ │ │ │ S │ 1│ 1,000│ │
│ 2 │00/10/01 │ B │ U │ 10│ 1,200│ 22,000│
│ │ │ │ V │ 5│ 1,800│ │
├───┼─────┼───┼──┼──┼────┼────┤
│ 3 │00/10/02 │ B │ T │ 8│ 950│ 7,600│
├───┼─────┼───┼──┼──┼────┼────┤
│ 4 │00/10/02 │ C │ U │ 25│ 1,200│ 30,000│
├───┼─────┼───┼──┼──┼────┼────┤
│ : │ : │ : │ :│ :│ : │ : │
└───┴─────┴───┴──┴──┴────┴────┘
解説)
第1段階として、第1正規化を行う。
初期状態では、商品の項目が受注先ごとにまとめて掲載されており、
右から4つの列が1つの表の中に2つ以上のデータを含んでいる。
このようなデータを繰返しデータと言うが、この部分が1行に1つの
データとなるように行を増やす。
┌───┬─────┬───┬──┬──┬────┬────┐
│受注No│ 受注日 │受注先│商品│数量│ 単価 │合計金額│
┝━━━┿━━━━━┿━━━┿━━┿━━┿━━━━┿━━━━┥
│ 1 │00/10/01 │ A │ S │ 3│ 1,000│ 3,000│
├───┼─────┼───┼──┼──┼────┼────┤
│ 1 │00/10/01 │ A │ T │ 2│ 950│ 1,900│
├───┼─────┼───┼──┼──┼────┼────┤
│ 2 │00/10/01 │ B │ S │ 1│ 1,000│ 1,000│
├───┼─────┼───┼──┼──┼────┼────┤
│ 2 │00/10/01 │ B │ U │ 10│ 1,200│ 12,000│
├───┼─────┼───┼──┼──┼────┼────┤
│ 2 │00/10/01 │ B │ V │ 5│ 1,800│ 9,000│
├───┼─────┼───┼──┼──┼────┼────┤
│ : │ : │ : │ :│ :│ : │ : │
このデータを元に、主キーを見つける。
この主キーは、特定の行を取り出したい場合に有効になる。
1項目だけを見れば、特定の行を取り出せるようにしたのが主キーの設定
ということ。
この表の場合は【受注No】と【商品】に注目すると、横1行のすべての項目
が特定できる。よって、主キーはこの2つになる。
このように、列の繰返しの部分をなくすことを第一正規化といい、
このようなデータを第1正規形(first normal form) という。
次の段階として、第2正規化を行う。
この段階では、第1正規化で得た主キーの一部だけで特定できる項目を
別の表に分る。
主キーの一部とは、【受注No】か【商品】のどちらかで特定できれば良いということ。
例えば、第1正規形で【受注No】に注目すると次のような表ができる。
┌───┬─────┬───┬────┐
│受注No│ 受注日 │受注先│合計金額│
┝━━━┿━━━━━┿━━━┿━━━━┥
│ 1 │00/10/01 │ A │ 4,900│
├───┼─────┼───┼────┤
│ 2 │00/10/01 │ B │ 22,000│
├───┼─────┼───┼────┤
│ : │ : │ : │ : │
また、【受注No】と【商品】に注目し・・・
┌───┬──┬──┬────┐
│受注No│商品│数量│ 単価 │
┝━━━┿━━┿━━┿━━━━┥
│ 1 │ S │ 3│ 1,000│
├───┼──┼──┼────┤
│ 1 │ T │ 2│ 950│
├───┼──┼──┼────┤
│ 2 │ S │ 1│ 1,000│
├───┼──┼──┼────┤
│ 2 │ U │ 10│ 1,200│
├───┼──┼──┼────┤
│ 2 │ V │ 5│ 1,800│
├───┼──┼──┼────┤
│ : │ :│ :│ : │
さらに、【商品】に注目すると以下のようになる。
┌───┬──┬──┐ ┌──┬────┐
│受注No│商品│数量│ │商品│ 単価 │
┝━━━┿━━┿━━┥ ┝━━┿━━━━┥
│ 1 │ S │ 3│ │ S │ 1,000│
├───┼──┼──┤ ├──┼────┤
│ 1 │ T │ 2│ │ T │ 950│
├───┼──┼──┤ ├──┼────┤
│ 2 │ S │ 1│ │ U │ 1,200│
├───┼──┼──┤ ├──┼────┤
│ 2 │ U │ 10│ │ :│ : │
├───┼──┼──┤
│ 2 │ V │ 5│
├───┼──┼──┤
│ : │ :│ :│
このように「○○がわかれば、横1行全部がわかる」と言うようなものを
見つけ、その関連でグループ分けを行うのが、第2正規化になる。
ここでいう「○○」というのが、そのレコードの主キーになる。
以上をまとめると、次の3つの表に分かれた。このようなデータを
第2正規形(second normal form) という。
┌───┬─────┬───┬────┐
│受注No│ 受注日 │受注先│合計金額│
┝━━━┿━━━━━┿━━━┿━━━━┥
│ 1 │00/10/01 │ A │ 4,900│
├───┼─────┼───┼────┤
│ 2 │00/10/01 │ B │ 22,000│
├───┼─────┼───┼────┤
│ : │ : │ : │ : │
┌───┬──┬──┐ ┌──┬────┐
│受注No│商品│数量│ │商品│ 単価 │
┝━━━┿━━┿━━┥ ┝━━┿━━━━┥
│ 1 │ S │ 3│ │ S │ 1,000│
├───┼──┼──┤ ├──┼────┤
│ 1 │ T │ 2│ │ T │ 950│
├───┼──┼──┤ ├──┼────┤
│ 2 │ S │ 1│ │ U │ 1,200│
├───┼──┼──┤ ├──┼────┤
│ 2 │ U │ 10│ │ :│ : │
├───┼──┼──┤
│ 2 │ V │ 5│
├───┼──┼──┤
│ : │ :│ :│
次の段階として、第3正規化を行う。
第3正規化は、主キー以外(受注No と商品以外)に注目して、グループ分けを行う。
この問題の場合では、これ以上分けることはできない。
よって、正規化した結果は次のようになる。
┌───┬───┬───┬────┐┌───┬──┬──┐
│受注No│受注日│受注先│合計金額││受注No│商品│数量│
└───┴───┴───┴────┘└───┴──┴──┘
┌──┬──┐
│商品│単価│
└──┴──┘