今回は僕がデータベーススペシャリストの勉強をして、
特に重要だと感じた正規化についてまとめました。
非正規形を第3正規形にしていく過程を具体例で確認していきます。
データベーススペシャリストを目指している方にはもちろん、
普通のシステムエンジニアやプログラマーにも抑えておいて欲しい内容です。
この記事を書いている僕はシステムエンジニア6年目
普段はJavaでWebアプリを作ったりSQL書いたり・・・(DBAのような仕事は普段していないです)
応用情報技術者試験に合格(2回落ちましたが。。)し、データベースの分野が得意だったので、
独学でデータベーススペシャリストの勉強をして、昨年合格(これは1発合格)しました。
今回は、データベーススペシャリストの勉強を通じて、
データベーススペシャリストを目指す人はもちろん、
普通のシステムエンジニアやプログラマーの方にも抑えておいて欲しい
正規化についてまとめてみました。
正規化
データベースのデータをある一定のルールに基づいて加工(分割)していくことを正規化と言います。
正規化の目的は、
データの冗長性を排除し、独立性を高めるために行います。
しかし、独立性を高めるためにデータを分割してデータ間に矛盾が発生したり、
分割したデータを元に戻せないようなことにならないため、
正規化ルールにのっとって整合性や一貫性を確保しながら分割していく必要があります。
正規化することでデータが「1事実1箇所(1 fact in 1 place)」になり、更新時異常を発生しないようにできます。
と、、いきなりそんなこと言われてもイメージつかないと思うので、、、
正規化されていないデータを正規化していく様子を確認していきます。
非正規形
まずは、以下の売上伝票を見てください。
この売上伝票を1つの売上伝票テーブルで管理しようとすると。。。
上のテーブルを見ると、
1行の中に繰り返し項目(複数行)として{商品コード、商品名、単価、数量、小計}が入っているのが分かります。
このような状態を非正規形と言います。
非正規形の定義は、
リレーションRの属性の中に単一でない値が含まれている。
第1正規形
先ほどの非正規形のテーブルを以下のようにすると第1正規形になります。
上の図を見ると、
非正規形の状態から繰り返し項目をなくしているのが分かります。
先ほどは{伝票番号}毎に1行(主キーが伝票番号)でしたが、
{伝票番号、商品コード}毎に1行(主キーが伝票番号、商品コードの組み合わせ)になりました。
第1正規形の定義は、
リレーションRの全ての属性が単一値である。
第2正規形
第2正規形の前に、、、
候補キーと関数従属性について理解しておく必要があります。
もし、理解できていない人は、以下の記事を参考にして見てください。


第2正規形の定義は、
リレーションRが次の二つの条件を満たす。
①第1正規形であること
②全ての非キー属性は、いかなる候補キーにも部分関数従属していない(完全関数従属である)こと
文章だと②はさっぱりですね。。。
具体的に見ていきましょう。
まず、部分関数従属と候補キー、非キー属性について以下の絵を見てください。
上の図において、
候補キーは{伝票番号、商品ID}の組み合わせですが、
商品IDが決まれば商品名が決まります。これが部分関数従属です。
逆に、数量は候補キー{伝票番号、商品ID}に完全関数従属します。
部分関数従属がない状態にすると第2正規形です。
では、先ほどの第1正規形のテーブルを第2正規形にすると。。。
第3正規形
最後に、第3正規形です。
第3正規形の定義は、
リレーションRが次の二つの条件を満たす。
①第2正規形であること
②全ての非キー属性は、いかなる候補キーにも推移的関数従属していない
それでは、推移的関数従属について具体例で見てみましょう。
上の図のように、
伝票番号(候補キー)→店舗ID(非キー属性)→店舗名(非キー属性)と
推移的に関数従属している状態をなくすと第3正規形になります。
しかし、、、
例えば、以下のような場合は推移的関数従属ではありません。
上の図の例だと、店舗IDが店舗名に関数従属する例です。
(必ず店舗名が一意になるような場合)
その場合、店舗名が候補キーになるため推移的関数従属にはなりません。
また、第3正規形にする過程で、
導出項目(今回の例では算出すれば求められる、小計、税金、合計、請求額)は取り除きます。
では、先ほどの第2正規形のテーブルを第3正規形にすると。。。
まとめ
今回は非正規形のテーブルを第3正規形まで正規化する手順を確認しました。
データベーススペシャリストの午後の試験では正規化の問題はほぼ必ず出るので、
合格を目指す人は対策をしておく必要があると思います。
特に第2正規形、第3正規形については、
定義を理解するだけでなく、自分で手を動かして正規化する練習を実際にしてみるのがオススメです。
そのためには、
関係の候補キーを全て列挙でき、関数従属性を全て見つけられるようになることが大事です!!
参考にした資料