データの正規化


正規化の詳細な定義に興味のある方は こちらをご覧下さい。
■正規形:
データの正規形(normal form)には、第1正規形から第5正規形 までがあるが、よく使われるのは、第1〜3正規形までである。
正規形 定義 性質
第一正規形 属性の値として、繰り返しなどの集合や
複合値をもたない表
表の各属性の値はそれ以上分解できない状態。
第二正規形 第一正規形で、すべての非キー属性が、
主キーに対し完全関数従属である表
表内の各行はお互いに独立している。
第三正規形 第二正規形で、すべての非キー属性が、
推移的に関数従属でない表
一つのキーの組みに対して行が一意に決まり、
項目の重複が無い。

■正規化の手順
非正規形

表の1レコードが、「受注番号」をキーとして、こんなふうに レイアウトされているとします(表X)。
1レコード中に「商品明細」が繰り返しいくつもあります。 (一つの明細「商品番号・商品名・単価・数量・金額」が、 一つのレコードの中に繰り返し続いて存在している。) レコードレイアウトが固定長だとすると、 明細の数に固定的な上限が必要となり拡張性に欠けますし、 同じ商品番号に関する明細が重複してあるか否かのチェックも 簡単には出来ません。 このようなレコード内の繰り返し項目は設計や実装の 柔軟性や拡張性を大きく損ないます。
そこで、このような繰り返し項目は、別の表に分離します。
第一正規形

繰り返し項目を、表Bとして 分離しました。 表Bは、[受注番号・商品番号] という連結キーを持ちます。 ここに着目!
第二正規形

連結キーの両方の項目が決まらなくても、 値が決まってしまう項目をBから探します。
[商品名]と[単価]は、[商品番号]さえ決まれば値が決まるので、 [商品番号]だけをキーとする 表B2に分離します。 第一正規形のBだと、[商品番号]に対して[単価]が変わった時、 複数の行(レコード)を変更する必要があります。 第二正規形では、B2を変更すれば、B1は無傷です。
第三正規形

キー以外の項目も全部眺めて、 キーにできる項目を、片っ端からキーとして、 別の表に分離していきます。
Aには、[得意先番号]→[得意先名]、 [担当営業番号]→[担当営業名]、という キーの関係があるので、これらを 表A2、A3に分離するわけです。
非正規形Xの1つの表が、 第三正規形にすることで、この場合、 A1、A2、A3、B1、B2の、 5つの表に分解されました。 ここまで来れば、例えば[得意先番号]に対して[得意先名称]が 変わったとしても、表A2を更新すれば良いだけで、 他の表の中身には影響を及ぼさない形になっています。
つまり、第三正規形では、あらゆる関数従属関係が、 別の表として分離されているので、ある関係の更新、削除、追加は、 それに対応する表だけをメンテナンスすれば良いことが 保証されているわけです。
(同じ関係が、表の中のあちこちの行に散らばっていて、 片っ端から修正しなければならない、なんて事態にはならないってこと。)