はじめに
前回の記事では、データベースの基本を学びました。
おかげでデータベースがどのようなものか理解していただけたと思います。
しかし前回お見せしたテーブル(表)は、まだ中身がぐちゃぐちゃで、使うことができません。
実際に使うためには、テーブル(表)の中身を整理する「正規化」ということをしなければなりません。
今回は、そんな正規化について学んでいきましょう!
まだデータベースの基本をご覧になっていない方は、こちらもぜひ読んでみてくださいね!
正規化とは
正規化とは一言で言うと、テーブルを整理して利用しやすくすることです。
ただ、ざっくりしすぎてよくわかりませんよね。
もう少し詳しく言うと、一つのテーブルにいろんな項目を入れるのではなく、
いくつかの専門的なテーブルに項目を分けようということです。
データベースを本棚に、データを本に例えてみましょう。
例えば、一つの大きい本棚にいろんなジャンルの本が入っているとします。
これだと利用するときにどうでしょうか。
いろんなジャンルの本がごちゃごちゃしてて利用しにくいですよね。
でも、ジャンルごとに別の本棚に分けられている場合はどうでしょうか。
ジャンルごとに分けられていれば、欲しい本をすぐに持ってくることができ、だいぶ利用しやすくなります。
データベースも似たようなもので、大きいテーブル一つよりも、専門的なテーブルいくつかに分けた方が後々都合がいいんです。
このように正規化とは、項目をいくつかの専門的なテーブルに分けることで、利用しやすいようにすることです。
正規化には、第一正規化、第二正規化、第三正規化があります。
第一正規化
第一正規化とは、まずデータをテーブルに入れられるような形にすることです。
具体的には、以下の二つを行います。
繰り返している項目を無くす
第一正規化でまず行うことは、繰り返している項目を無くすことです。
例えば、以下のようなデータがあるとしましょう。
このテーブルでは石井さんはリップクリームとお菓子を買っていますが、テーブルの項目には買った商品の欄は一つしかありません。
このままだとデータを入れられないですよね…困りました…
こんな時にするのが「繰り返し項目を無くす」という作業です。
「繰り返し項目を無くす」とは、石井さんがリップクリームを買ったデータと、お菓子を買ったデータを全く別のデータとして扱うということです。つまり。こんな感じになりますね。
これで無事、データベースにデータを入れることができました。
他の項目から導き出せる値を無くす
第一正規化でもう一つやることは、他の項目から導き出せる値を無くすことです。
これは単純に、他の項目から導き出せることは、わざわざデータとして持っておく必要はなく、
その都度計算して出せばいいからです。
無駄な項目はできるだけ持ちたくないということですね。
ここでは、単価と個数から求められる合計金額の項目を削除しています。
このように第一正規化では、繰り返している項目や、他の項目から導き出せる項目を削除することで、データベースに入れられるような形に変形します。
第二正規化
第二正規化とは、分野別に項目を他のテーブルに切り出していくことです。
本棚でいう、ジャンルごとに本棚を分けるイメージですね。
第二正規化では、主キーを使って別の項目に切り分けていきます。そのために、まずは主キーの説明をしますね。
主キーとは
主キーとは、表の中でその項目が分かればレコードが一つに決まる項目のことです。
この主キーは、1つの項目だけで決まることもあれば、いくつかの項目を組み合わせて決まる場合もあります。
先の表で考えてみましょう。
この表の場合、どの項目が分かればレコードは一つに決まるでしょうか。
もう少し砕けた言い方をすると、「『名字』が『鈴木』のデータを持ってきて」のような言い方で他人に頼むとき、
どの項目で頼めば、レコードが一つに決まるでしょうか。
「名字」で選ぶと困ったことになりますね。
同じ鈴木さんでも、鈴木五美さんと鈴木六郎さんがいて、違う人のデータが取れてしまいます。
『名前』や『性別』でも同様です。
この場合は、『出席番号』がいいでしょう。
「『出席番号』が『1番』の人のデータ」と言えば、人を間違えることがありません。
出席番号が決まれば、名字、名前、性別が一意に決まります。
ただし、この出席番号が1番の人のレコードも、二つあります。
この表では、もう一つ主キーが必要そうですね。
今、出席番号が1番の人のデータでも、リップクリームを買ったデータとお菓子を買ったデータがあります。
そのため、買ったもの側でも、主キーを探さなければなりません。
いきなり言ってしまいますが、答えは「商品コード」です。
商品コードが分かれば、購入品と単価が一意に決まります。
つまりこの表では、出席番号と商品コードが分かればレコードを一意に見つけることができます。
「『出席番号』が『1番』で、『商品コード』が『R1』のレコードを持ってきて」で一つに絞れますもんね。
このように、表の中でその項目が分かればレコードが一つに決まる項目のことを主キーと言います。
今回の主キーは「出席番号」と「商品コード」です。
第二正規化のやり方
話を元に戻しますが、第二正規化では先ほど調べた主キーを使って、下記画像のようにテーブルを切り分けていきます。
まず主キーである「出席番号」を使用して、生徒の名簿テーブルを切り分けます。
こうやって切り分けることで、これ以降「出席番号〇番」と記載すれば名字や名前を記載しなくても調べることができます。
同様に主キーである「商品コード」を使用して、商品テーブルを切り分けます。
このテーブルで、商品コードと購入品、単価をまとめるわけですね。
結果として、かつての表はここまで簡略化することができます。
このように、主キーで分野ごとに別のテーブルに切り分けていくのが第二正規化です。
第三正規化
最後の第三正規化は、外部キーを用いてさらに細かくデータを切り分けます。
ただし今回切り分けるのは、第二正規化で表から切り分けたテーブルです。
その中から関連のある項目をさらに別のテーブルに切り出していきます。
具体的には、今回切り分けるのは「購入品」と「単価」です。
季節などにより金額の変更があるとはいえ、購入品が一つに決まればその時の単価は一つに決まりますよね。
なので、「商品の価格テーブル」にまだ分解することができるんです。
このとき、今までは主キーでもなかった「購入品」という項目が、商品価格テーブルでは主キーになりました。このような項目を外部キーと言います。
このように第三正規化では、外部キーを使用してさらに細かいテーブルに切り分けていくのです。
何故ここまで細かくする必要があるのか疑問に思うかもしれません。
理由はいくつかあるのですが、細かく分けることで、変更があったときに修正する箇所が一か所で済むという利点があります。
例えば一番最初の表で「お菓子」の単価が330円から550円に値上がりしたとき、2行目と6行目の2か所を直さなければなりません。
まして、もっと人数が増えたときにはさらに大変になりそうですよね。
しかし商品価格テーブルまで分けておくと、修正する箇所は商品価格テーブルの1か所だけで済むのです。
変更する箇所が少なくなることで、ミスも手間も減るので一石二鳥なんですよね。
まとめ
いかがだったでしょうか。
作成したテーブルは、正規化によってより小さな、専門的なテーブルに分けられるということを理解していただけたでしょうか。
これによって、修正するときに手間がかからないようにしているんですね。
試験では正規化するとしたらどう分けるかを聞かれることが多いので、是非自分でも正規化を練習してみてください。
練習問題
練習問題1
問)“発注伝票”表を第3正規形に書き換えたものはどれか。ここで,下線部は主キーを表す。
(平成20年 春期 問30から出題)
発注伝票(注文番号,商品番号,商品名,注文数量)
ア、発注(注文番号,注文数量)
商品(商品番号,商品名)
イ、発注(注文番号,注文数量)
商品(注文番号,商品番号,商品名)
ウ、発注(注文番号,商品番号,注文数量)
商品(商品番号,商品名)
エ、発注(注文番号,商品番号,注文数量)
商品(商品番号,商品名,注文番号)
答)ウ
正規化するということなので、注文番号,商品番号,商品名,注文数量の中で、1つ項目が決まれば関連して決まる項目を探してみましょう。
答えは、商品番号と商品名ですね。商品番号が決まれば商品名も決まります。
そのため、「商品」に商品番号と商品名、「発注」に商品番号とその他の項目があるウが正解です。
練習問題2
問)属性xの値によって属性yの値が一意に定まることを,x→yで表す。図に示される関係を,第3正規形の表として正しく定義しているものはどれか。ここで,xの四角内に複数の属性が入っているものは,それら複数の属性すべての値によって,属性yの値が一意に定まることを示す。
(平成20年度 春期 問56から出題)
ア、表1 {a}
表2 {b, c, d, e}
表3 {f, g, h}
イ、表1 {a, b, c, d, e}
表2 {a, c}
表3 {b, e, f, g, h}
ウ、表1 {a, b, c, d, e}
表2 {b, c, f, g, h}
表3 {b, c, h}
エ、表1 {a, b, c, d, e}
表2 {b, f, g}
表3 {b, c, h}
答)エ
この問題は図の見方に慣れる必要があるのですが、やっているのは主キーでまとめるということです。
最初のa,b,c,d,eで表しているのが、先ほどの「出席番号が決まれば、名字、名前、性別が一意に決まる」という部分です。
この例では、aが出席番号、bが名字、cが名前、dが性別です。
つまり、矢印が出るものが主キー、矢印が向かっている先が従属している値となります。
そのため、テーブルを分けると同じテーブルになるグループを選べばいいので答えはエになります。
練習問題3
問)関係を第3正規形まで正規化して設計する目的はどれか。
(平成26年度 秋期 問26から出題)
ア、値の重複をなくすことによって,格納効率を向上させる。
イ、関係を細かく分解することによって,整合性制約を排除する。
ウ、冗長性を排除することによって,更新時異状を回避する。
エ、属性間の結合度を低下させることによって,更新時のロック待ちを減らす。
答)ウ
正規化する利点は、テーブルを分割し修正する箇所を少なくすることで、更新ミスやエラーを回避することができる点です。