リレーショナルデータベースの基本
1つのマス目に1つのデータを入れる「第1正規形」
前のページで結合について述べましたが、結合をうまく行うためには、データを適切にテーブルに分ける必要があります。
この作業のことを、「正規化」と呼びます。また、正規化には段階があって、「第1正規形」から「第5正規形」までがあります。ただし、一般には第3正規形までの正規化を行うことが多いです。
例えば、文具の卸を行っている企業で、販売した商品に関するデータを表にして管理したいとします。単純に表にすると図3-1のような形になるでしょう。
この表を見ると、1つの伝票に対して複数の商品があります。1件の伝票を1つの行に対応させるとすると、「商品番号」や「商品名」などの列では、1つのマス目に複数の値を入れる状態になります。
このような状態をなくし、1つのマス目には1つのデータだけを入れるようにした形のことを、「第1正規形」と呼びます。
第1正規形を作る際には、1つのマス目に複数の値が入る列を、元のテーブルから切り離して別のテーブルにします。そして、切り離した後のテーブルの、切り離す元のテーブルとの結合関係が分かるような列を作ります。
表1の例だと、「販売先」までの列と、「商品名」から後の列とで、テーブルを2つに分けます。そして、商品に関するテーブルにも「伝票番号」の列を入れておいて、2つのテーブルを結合できるようにします(図3-2参照)。
重複するデータを2つのテーブルに分ける「第2正規形」「第3正規形」
テーブルの列の中で、個々の行を識別するのに使える列(または列の組み合わせ)のことを、「主キー」と呼びます。
例えば、図3-2の伝票メインテーブルでは、「伝票番号」列は行(個々の伝票)ごとに違った値になりますので、主キーになります。また、伝票サブテーブルでは、「伝票番号」列と「商品番号」列の値の組み合わせで個々の行を識別できます。したがって、これら2つの列の組み合わせが主キーになります。
また、テーブルの列同士の間には、「ある列の値が決まると、別の列の値も決まる」という性質があります。例えば、図3-2の伝票メインテーブルでは、「伝票番号」列の値が決まると、「日付」列の値も決まります。このような関係のことを「関数従属」と呼びます。関数従属には、以下の3種類があります。
1)完全関数従属…ある列が主キーに関数従属する
2)部分関数従属…ある列が主キーの一部の列に関数従属する
3)推移的に関数従属…ある列が主キー以外の列に関数従属する
例として、図3-2の2つのテーブルで、主キーの列と、列間の関数従属の関係を調べてみましょう。
前述したように、伝票メインテーブルでは、主キー(「伝票番号」列)が決まると「日付」列の値も決まります。したがって、「日付」列は主キーに完全関数従属しています。同様に、「販売先番号」列も主キーに完全関数従属しています。
一方、「販売先」列は「販売先番号」列によって決まる列で、主キーには直接には関数従属しておらず、推移的な関数従属の関係になっています。
次に、伝票サブテーブルを調べてみます。このテーブルの主キーは、「伝票番号」列と「商品番号」列の組み合わせです。
「個数」列は主キーで決まるので、完全関数従属です。一方、「商品名」列と「単価」列は「商品番号」列によって決まります。「商品番号」列は主キーの一部なので、「商品名」列と「商品番号」列の関係は、部分的関数従属です。また、「単価」列と「商品番号」列も部分的関数従属の関係です(図3-3参照)。
部分関数従属や推移的な関数従属があると、1つのテーブルの中に同じ値を何度も入力する場面が出てきます。例えば、図3-2の伝票メインテーブルには、同じ販売先の情報を何度も入力する必要があります。
部分関数従属している列を別のテーブルに分けると、「第2正規形」になります。また、推移的に関数従属している列を別のテーブルに分けると、「第3正規形」になります。ここまでの正規化を行うと、1つのテーブルに同じデータを何度も入力することがなくなり、無駄がなくなります。
例えば、図3-2の2つのテーブルを第3正規形まで分解すると、図3-4の4つのテーブルに分かれます。伝票サブテーブルから商品の情報を分離すると、第2正規形になります。また、伝票メインテーブルから販売先の情報を分離すると、第3正規形になります。
ここまでで第1回は終わりです。今回は、データベースとは何かというところから、現在の主流であるリレーショナルデータベースの考え方について解説してきましたが、いかがだったでしょうか。
次回はSQLの基本について解説していく予定です。
【参考文献】
藤本壱『これだけは知っておきたいデータベースの常識』技術評論社(発行年:2009)