本記事では、非正規形から第3正規形までの正規化について記載します。
非正規形→第1正規形→第2正規形→第3正規形
第3正規形までの正規化については、以下記事でも案内しているので、あわせてご参照ください。
auroralights.jp
非正規形について
非正規形の定義は以下の通りです。
<非正規形の定義> リレーションRの属性の中に、単一でない値が含まれている
以下画像では、商品コード、商品名、単価、数量、小計が単一値でなく、繰り返し項目になっています。
単一値になっていないため、第1正規形と判断できます。

非正規形は、1枚の伝票をテーブルの1行にしたと考えるとわかりやすいです。以下の伝票イメージでは、1枚の伝票で商品コード、商品名、単価、数量、小計が繰り返し項目になっていることが分かります。

第1正規形について
第1正規形の定義は以下の通りです。
<第1正規形の定義> リレーションRの全属性が単一値である
つまり、非正規形から第1正規形への正規化は、繰り返し項目をなくし、全属性を単一値にします。

第2正規形について
第2正規形の定義は以下の通りです。
<第2正規形の定義> リレーションRが次の2条件を満たすこと。 ①第1正規形であること (全属性が単一値である) ②すべての非キー属性は、いかなる候補キーにも部分関数従属していないこと (完全関数従属であること)
第2正規形は非キー属性が候補キーに完全関数従属している、言い換えると、非キー属性がいかなる候補キーにも部分関数従属していない形になっています。
『非キー属性がいかなる候補キーにも部分関数従属していない』は、候補キーの一部から非キー属性が決定できない状態です。
第1正規形で候補キーの一部が非キー属性を決定している部分関数従属があるかどうかを確認します。

<部分関数従属>
1.伝票No → 店舗CD,店舗名,店舗,住所,売上日,合計,消費税,請求書,担当者ID,担当者名
2.商品コード → 商品名,単価,数量,小計
部分関数従属を排除するために、リレーションを分割します。
「1.」を売上ヘッダ、「2.」を商品というリレーションに分割します。

※今回の例では、主キーは伝票No,商品コードとしている。
商品コードと商品名は1対1の関係であるので、{伝票No,商品名}は候補キーとなる。商品コード、商品名は候補キー同士なので分解しても、しなくても良いが、今回は分解して考える。
第3正規形について
第3正規形の定義は以下の通りです。
<第3正規形の定義> リレーションRが次の2条件を満たすこと。 ①第2正規形であること ②すべての非キー属性は、いかなる候補キーにも推移的関数従属していないこと ★導出項目も削除する
推移的関数従属とは、X→Y→Zが成立するが、Y→Xは成立しない状態です。
※ZはYの部分集合ではないことも条件です。
このとき、X → Zも成立します。ただし、Z → Xは成立しません。
以下画像の「売上ヘッダ」において、伝票No→店舗CD→店舗名、店舗住所、伝票No→担当者ID→担当者名が推移的関数従属しているので、リレーションを分割します。
また、小計、合計、消費税、請求額のような導出項目を取り除きます

以上、お読みいただきありがとうございました。