データベースにおけるデータの正規化を完全理解する

基本情報技術者試験や応用情報技術者試験で必ず出てくる単元であるデータベース。

その中で、データの正規化というトピックが出てきます。

正規化は、データをデータベースで管理するうえで欠かせない作業なので、実業務でも求められるスキルだと思います。

ですが、その手順がややこしいなと感じていました。

そこで今回は、正規化の流れについてわかりやすくまとめていきたいと思います!

正規化とは

データベースの正規化とは、『データに矛盾や重複が生じないように最適化すること』です。

正規化は、3段階に分かれており、それぞれの状態を表(データ)を「第1正規形」、「第2正規形」、「第3正規形」と呼びます。また、全く正規化が行われていないデータは非正規形と呼ばれます。

それぞれの形の特徴は以下の通りです。

非正規形:繰り返し部分を持つ表

第1正規形:繰り返し部分を分離させ、独立させた表

第2正規形:部分関数従属している列を独立させた表

第3正規形:主キー以外の列に関数従属する列を独立させた表

これだけではさっぱりわからないので、1つずつどのような状態なのか見ていきましょう^^

非正規形

非正規形とは、1つのレコード(行)に繰り返しの部分を持っている状態を指します。

以下に3つの請求書があります(見にくかったらごめんなさい、、)。

この請求書1枚を1件のレコードとして表してみましょう。

購入した商品に関する情報が、商品の数だけ繰り返されていることがわかると思います。

各請求書ごとに購入した商品の数が違うので、それぞれのレコードの長さがバラバラになってしまっています。

こういった状態を、繰り返し部分を持った状態、つまり、『非正規形』と呼びます。

リレーショナルデータベースでは、こういった形式の表を管理することはできません。

管理できるようにするには、各レコードの長さを揃える必要があります。

第1正規化

非正規形の表をリレーショナルデータベースで管理できるようにするために、繰り返し部分を排除するのが第1正規化です。

排除するといっても、データをきれいさっぱり消してしまうわけではありません。

1つのレコードでの繰り返し部分は分離し、新たな独立したレコードとして挿入します。

先ほどの請求書のレコードを第1正規化してみましょう。

第1正規形

それぞれのレコードの長さが同じになりましたね。色が変わっているレコードが、繰り返し部分として分離され、独立したレコードです。

「金額」列が消えていますが、金額は単価×数量で求めることができます。

このように、計算して求められる列は取り除いてしまいます。

こうして、第1正規形が完成しました。

第2正規化

第2正規化とは、第1正規形から部分関数従属している列を取り出すことを指します。

よくわからない言葉が出てきました。部分関数従属とは一体何なのでしょうか?

第2正規化のまえに、関数従属という言葉を押さえておきます。

関数従属と部分関数従属

これらはある列の主キーに対する関係性を表す言葉です。

関数従属

主キーの値が決まることで、列Xの値が決まる場合を考えます。

例えば、以下の例では、顧客コードが決まると、顧客名が決まります。

この場合、「顧客名は顧客コードに関数従属している」と言います。

主キーが複合キーの場合も同様です。

このテーブルでは、学年、組、出席番号が決まることで、名前が決まります。

この場合でも、関数従属しているといえます。

部分関数従属

主キーが複数の場合(複合キー)の場合を考えます。

複合キーのすべてではなく、一部の項目だけで列の値が決まるような関係を、部分関数従属と言います。

先ほど作った第1正規形を例にとってみます。

この表の主キーは「請求書番号」、「品目番号」の2つです。

その中で、「請求書番号」が決まれば「請求日」、「顧客コード」、「顧客名」が決まります。また、「品目番号」が決まれば「商品名」と「単価」が決まります。

このように、主キーの一部に関数従属するような関係性を『部分関数従属』というのです。

第2正規化

それでは、関数従属の知識をもとに、第2正規化を行っていきましょう。

繰り返しになりますが、第2正規化とは、第1正規形から部分関数従属している列を取り出す作業です。

部分関数従属の説明のところで示した第1正規形の表を見ると、矢印のついている項目が部分関数従属しています。なので、これらを分離します。

このように、3つの表に分離することができました。

この形では、部分関数従属する列がどの表にもありません。なので、これが第2正規形の表となります。

分離しただけのとき、請求書表や商品表ではすべて同じ値のレコードが複数存在していましたが、重複するレコードを複数管理する必要はありません。そういった場合は、重複するレコードがないようにレコードを削ります。

第3正規化

ここまで来たら、もう一息です。

第3正規化では、主キー以外の列に関数従属している列を取り出します。

主キー以外という点がキーポイントです。

先ほど第2正規化した3つの表で確認してみましょう。

請求書表に着目します。「顧客名」は、主キーではない「顧客コード」列に関数従属しています(顧客コードが決まると顧客名が決まる)。

なので、顧客名を請求書表から取り出します。

これで、第3正規形の完成です。

ここまでくれば、データベースで効率的に管理できる表の構造をとっているといえます。

まとめ

いかがでしょうか。

第1正規形はすんなり理解できたけど、第2正規形と第3正規形の違いがややこしいですね^^;

しかし、正規化の流れを順を追って見ていくと、その内容も見えてきたのではないでしょうか?

情報処理試験では頻出項目なので、是非とも押さえておきたい内容です^^

ではでは👋