[DB] 第一正規化・第二正規化・第三正規化の違い

どうも、tatsuです!

今回は第一正規化・第二正規化・第三正規化の違いについて書いていこうと思います。

注意
この記事ではテーブルを見やすくするために、1つのテーブルを分割して表示している場合があります。

そのテーブルは右端と左端が同じ色になってますので、そのようなテーブルは繋がっていると思って読んでください。

例として使う非正規形テーブルは下図になります。
皆さんなじみがあると思いますので、コンビニのレシートを例にしたテーブルとなっています。

補足
非正規形とは、繰り返し項目を含むテーブルのことです。

しかし、OracleなどのRDBで繰り返し項目を含むテーブルを作ることは不可能なので、基本的にテーブルは第一正規化された状態から始まると思ってください。

今回は第一正規化を説明するために非正規形のテーブルから始めます。

第一正規化

第一正規化は、非正規形から繰り返し項目を排除した形になります。

今までは{レシート番号}が決まれば他の項目も決まっていましたが、繰り返し項目を排除することによって{レシート番号,商品コード}が決まれば他の項目が一意に決まるようになりました。

第二正規化

第二正規化は、第一正規形であること & 全ての非キー属性はどんな候補キーにも部分関数従属していないことが条件となります。

条件の1つ目の「第一正規形である」ということは「繰り返し項目を排除する」ことというのはもうお分かりですよね?

条件の2つ目の「全ての非キー属性はどんな候補キーにも部分関数従属していない」ことについては例を挙げて説明します。

候補キーとは?
候補キーとは、その項目が決まれば他の項目が一意に定まる項目の組合せのことです。

第一正規化のときのテーブルを例にすると、{レシート番号,商品コード}の組合せが候補キーとなります。

もちろん候補キーは複数の組み合わせでなければいけないといったことはなく、1つの項目が決まれば他の項目も一意に定まる場合、候補キーは1つになります。

部分関数従属とは?
部分関数従属とは、候補キーの一部だけで他の項目が一意に定まる場合のことを指します。

第一正規化のときのテーブルを例にすると、{レシート番号,商品コード}の組合せで他の項目が一意に定まりますが、候補キーの一部である{レシート番号}だけでも{店舗ID,店舗名,住所,合計,消費税,請求額,日時,担当者コード,担当者名}が一意に定まります。

また、候補キーが1つの場合は部分関数従属はしていないので条件の2つ目は自動的にクリアしていることになります。

したがって、2つ目の条件を満たすためにテーブルを分割する必要があります。分割後のテーブルは下図のようになります。

これで部分関数従属している非キー属性は無くなりました。

第三正規化

第三正規化は、第二正規形であること & 全ての非キー属性はどんな候補キーにも推移的関数従属していないことが条件となります。

条件の1つ目の「第二正規形である」ということは前述したとおりです。

条件の2つ目の「全ての非キー属性はどんな候補キーにも推移的関数従属していない」ことについては例を挙げて説明します。

推移的関数従属とは?
推移的関数従属とは、非キー または 候補キー+非キー によって非キー項目が一意に定まることを指します。

第二正規化のときのテーブルを例にすると、非キー属性の{店舗ID}が決まると{店舗名,住所}が一意に定まります。

このような場合、推移的関数従属していると言うことができます。

したがって、2つ目の条件を満たすためにはテーブルを分割する必要があります。

また、一般的に第三正規化をする場合には導出項目を排除しますので、第三正規化されたテーブルは下図のようになります。

導出項目とは?
導出項目とは、計算することによって求めることができる項目のことを指します。

第二正規化のときのテーブルを例にすると、{小計,合計,消費税,請求額}が対象になります。


これで第三正規化の完成です!

まとめ

いかがでしたでしょうか。

私自身忘れてしまうことがあるため今回この記事を書かせてもらいました。

みなさんもすこし忘れてしまったときに見返してもらえるとうれしいです!

それでは!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です