目次へ

16.3. 正規化

正規化は優れたデータベースを構築するには必須の概念です。正規化とは、実世界の事象や情報を、データベース上で効率よく利用できるようにモデル化することや、その手順のことを言います。リレーショナル型データベースでは、複雑なテーブルを特定の規則に従って単純なテーブルに分割することが正規化であるといえます。

まだ正規化されていないものを非正規形、正規化されたものを正規形といいます。正規形には、正規化の程度により、第一正規形から第五正規形まであります。ほとんどの場合、第三正規形まで正規化すれば的確な正規化がなされたとしてよいとされています。ここでも第三正規形までについて説明します。

正規形の説明の前に、重要なキーワードについて説明します。

関数従属性
ある列の値 X が決まると同時に、別の列の値 Y が自動的に決まるとき、Y は X に関数従属であるといいます。Y が X に関数従属であるとき、X → Y と表記します。
推移的関数従属性
ある関数従属関係から、新たな関数従属関係が得られるような場合、推移的関数従属性を持つといいます。X → Y 及び Y → Z の関係があるとき、X → Z は推移的関数従属性を持ちます。

次に、それぞれの正規形について説明します。

非正規形
全く正規化が行われていない状態のテーブルをいいます。ER モデルの説明に用いた受注伝票を 1つのテーブルにしたものは、非正規形のテーブルです。
第一正規形
非正規形のテーブルを、繰り返し現れる列がない状態にしたものをいいます。列を固定部分と繰り返し部分にグループ化し、固定部分と繰り返し部分をキーを用いて連結することをいいます。
第二正規形
主キーとなる列の値が決まれば、他の列の値が決まるようにテーブルを分割した状態をいいます。関数従属関係のある部分は、別テーブルに分割するということです。
第三正規形
主キーとなる列以外の値によって、他の非主キー列の値が決まることがない状態にテーブルを分割した状態をいいます。推移的関数従属関係である部分を、別テーブルに分割するということです。

受注伝票を例に正規化を行います。まず、伝票の状態をテーブルに変換します。このときのテーブルは次のような形になります。

非正規形のテーブル

商品番号から合計金額の部分は、あと 4つ右へ続いているものとします。このように、非正規形のテーブルは非常に大きなものになり、同じ列が何度も繰り返されます。この例の場合は、商品番号〜合計金額の部分が 5つあることになります。

この非正規形のテーブルを第一正規形にします。繰り返し部分を切り離して別のテーブルにします。ただし、そのまま切り離したのでは、受注番号と商品の関係などが不明になりますので、受注番号と商品番号を連結キーとして分離します。分離したテーブルは次のようになります。

第一正規形のテーブル

第二正規形を作成するには、関数従属性を満たすテーブルに分割しなければなりません。第一正規形の上のテーブルでは、受注番号→受注日、顧客名、顧客住所という関数従属関係が成立しているので、第二正規形の条件を満たしています。

次に下のテーブルについてですが、合計金額は単価と数量から計算されるものですので、この時点で取り除きます。すると、(受注番号、商品番号) →数量、(商品番号) →商品名、単価という二つの関数従属関係が存在することがわかります。

第一正規形の場合は、主キー (受注番号、商品番号) の一部 (商品番号) により、商品名と単価が決まっています。このようなとき、商品名と単価は、主キーに対して部分関数従属しているといいます。第二正規形では、このような部分関数従属関係をなくすようにします。

第二正規形のテーブル

次に第三正規形を作成します。

第二正規形のテーブルのうち、一番上のテーブルを分割します。このテーブルでは、受注番号→顧客名、顧客名→顧客住所となっており、受注番号→顧客住所は推移的関数従属関係を形成しています。よって、このような部分を別テーブルとします。

真中のテーブル、一番下のテーブルは、推移的関数従属関係は持たないため、分割の必要はありません。

第三正規形のテーブル

このようにして、最初は一枚の帳票であった受注伝票を、シンプルなテーブルに分割することができます。受注伝票の状態から正規化によりどのようなメリットが生まれたのかを以下に示します。

  • 顧客の住所が変更になったときには、顧客を主キーとするテーブルを変更するだけでよい。
  • 合計金額を、単価と数量により別に計算させることにより、計算ミスが減り、データ領域も節約できる。
  • 商品の名称や単価が変更になったときは、商品番号を主キーとするテーブルを変更するだけでよい。

正規化することにより、一般的に次のような利点が生まれます。

データ管理の容易化
データに変更の必要が生じたときに、変更する手間が大幅に削減されます。
データの部品化
正規化されたデータは他のシステムで利用できる可能性が高まります。
データ容量の削減
データの関係を明確にすることにより、無駄な列を削除することができます。その結果、データ処理の効率も上がります。

正規化はデータベース設計には欠かせない概念です。しかし、正規化すれば必ず優れたデータベースになるとは限りません。正規化することにより、テーブルの数が増えます。これにより検索などでテーブルを結合する場合は、その処理が複雑になることにより、パフォーマンスが低下する可能性もあります。正規化することにより生ずるメリットと、デメリットのバランスを考えて正規化することが大切です。

とはいっても、正規化によるメリットは、データの関係を明らかにすることにより生じます。ですから、パフォーマンスのことを考えて、正規化を最後までしないということではなく、正規化したものを、状況に応じて崩すという考え方が大切です。

16.4. ボイスコッド正規形

前節で述べた第三正規形は、のちにボイスコッド正規形として強化されます。ボイスコッド正規形とは、すべての列が主キーに完全関数従属で、他に完全関数従属関係がないものを言います。

完全関数従属について説明します。

例えば、X が要素 (X1, X2, X3, X4) からなるとき、(X1, X2, X3) とか (X1, X4) などの要素の真部分集合から Y を一意に定めることができる場合、X → Y は完全関数従属ではありません。完全関数従属であるのは、X のすべての要素が決まって初めて Y の値が決定することをいいます。受注伝票の例でいうと、第三正規形の 2 番目のテーブルで、X の要素を (受注番号、商品番号) とし、数量を Y としたとき、X → Y は完全関数従属であるといえます。

第三正規形になってもまだ完全関数従属でない部分が残る場合があります。このような部分を別テーブルにしてすべての列が主キーに対して完全関数従属であるようにしたものをボイスコッド正規形といいます。

次のようなテーブルを考えてみましょう。

社員番号 メールアドレス 所持している本

このテーブルは、社員番号、メールアドレス、所持している本からなります。社員番号、所持している本が主キーです。このとき、次のような前提条件があります。

  • 1人の社員が複数の種類の本を持つことがある。
  • 1人の社員は同じ種類の本を複数持たない。
  • 同じ種類の本を所持している社員は他にもいる。
  • 1人の社員は1つのメールアドレスしか持たない。
  • 同じメールアドレスを持つ社員はいない。

データの例は次のようになります。

社員番号 メールアドレス 所持している本
1 [email protected] 本 A
1 [email protected] 本 B
2 [email protected] 本 B

このとき、非主キー列「メールアドレス」は「社員番号」から決まりますので、(社員番号、所持している本) →メールアドレスは関数従属の関係が成立しています。よって、このテーブルは第二正規形の条件を満たしていると言えます。同時に、推移的関数従属の関係も存在しないので、第三正規形の条件も満たしています。

しかし、メールアドレス→社員番号という関数従属関係が存在しており、ボイスコッド正規形ではありません。ボイスコッド正規形では、主キーからの完全関数従属関係以外の関数従属関係を別テーブルとします。つまり、次の 2つのテーブルに分離します。

社員番号 メールアドレス
社員番号 所持している本

上のテーブルは、社員番号を主キーとし、下のテーブルでは社員番号と所持している本を主キーとします。非主キー列の存在する上のテーブルでは社員番号→所持している本という完全関数従属関係が成立しています。これらのテーブルは、ボイスコッド正規形の条件を満たしています。

実習課題1

四次元図書館 (仮名) では、会員が図書を借りるときには、必ず次のような図書貸出カードを発行している。

図書貸出カード
会員番号: 貸出日:
会員名: 返却予定日:

書籍番号 書籍名 著者
     
     
     
     
     
四 次 元 図 書 館

この図書貸出カードをテーブルにし、正規化しなさい。第一正規形、第二正規形、第三正規形、ボイスコッド正規形を示して、正規化した流れがわかるようにすること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp