矢沢久雄

●リレーショナルデータベース

 今回は,データベースの設計を行いながら,リレーショナル・データベースの基礎をマスターしましょう。データベースの設計には,掟(おきて)と呼べるほど確立された考え方がいくつかあります。

 データベースは,複数のテーブル(表)の集合体として設計されます。個々のテーブルは,ほかのテーブルと関連性(リレーション)を持つものとなります。このような構造のデータベースのことをリレーショナル・データベース(RDB:Relational DataBase)と呼びます。

 データベースの構造には,リレーショナル・データベースのほかに,カード型データベースと呼ばれるものもあります。カード型データベースは,名刺のように1件のレコードを1枚のカードにまとめて記録するものです。これは,ワープロの1ページに任意の情報を書き込んで,それを1枚のカードにするようなものです。以下に,カード型データベースと,リレーショナルデータベースのイメージを示しておきます(図1)

図1●カード型データベースとリレーショナル・データベースのイメージ

 現在では「データベースとは,リレーショナル・データベースのことである」と考えて間違いありません。カード型データベースはめったに使われないからです。なぜなら,リレーショナル・データベースの方が,カード型データベースよりさまざまな面で優れているからです。市販のデータベース管理システムのほとんどは,リレーショナル・データベースを採用しています。この講座でも,リレーショナル・データベースだけを取り上げます。では,簡単なリレーショナル・データベースの設計を行ってみましょう。

●データの洗い出しと属性の決定

 データベースの設計は,必要とされるデータをすべて洗い出すことから始まります。ここでは,電話帳のデータベースを作成することを想定して,必要なデータを洗い出してみましょう。「氏名」「電話番号」「FAX番号」「会社名」「郵便番号」「住所」「E-mail」…などと,考えればきりがありませんね。ただし,欲張るのは禁物です。実際には必要とされないデータをデータベースに加えてしまうと,あとで管理が面倒になるからです。本当に必要とされるデータなのかどうか,よく考えることが大切です。ここでは,シンプルに「氏名」「電話番号」「会社名」の三つのデータだけにしましょう。これらは,テーブルのフィールド(テーブルを構成する列のこと)となります。テーブルの名前は,「電話帳テーブル」としておきましょう(図2)

図2●電話帳テーブルの作成

 次に,個々のフィールドの属性を決定します。これは,格納するデータが文字なら文字数を決定し,格納するデータが数値なら値の範囲を決定する作業です。この作業は,慎重に行ってください。テーブルにレコード(テーブルを構成する行のこと)を登録してしまった後は,フィールドの属性を変更できないからです。ここでは,以下のようにフィールドの属性を決定しました。電話番号をハイフンを含んで13文字にしたのは,携帯電話では111-2222-3333のように「11桁+ハイフン二つ=13文字」となるからです。すべてのフィールドに対して,このような注意が必要です(図3)

図3●フィールドの属性を決定する

●テーブルの正規化

 電話帳テーブルにレコードを登録してみましょう。図4のように,3件のレコードを登録しました。電話帳テーブルをよく見てください。「日経BP社」という同じ会社名のフィールドを持つレコードが2件ありますね。実は,これが大問題なのです。

図4●同じ値のフィールドを持つレコードが2件ある

同じ値を持つフィールドを複数のレコードに登録できてしまうことは,次のような問題を引き起こすからです。

(1)同じ会社名を何度も登録することになり,面倒である
(2)たとえば「(株)ヤザワ」と「株式会社ヤザワ」が,異なる会社名であるとみなされる
(3)会社名が変更されたら,関係するレコードすべてに修正が必要となる

 これらの問題を解決するためには,電話帳テーブルを二つのテーブルに分割し,個々のテーブルのフィールドが,同じ値にならないようにします。これをテーブルの正規化と呼びます。正規化とは「同じものをまとめる」という意味だと考えてください。

 電話帳テーブルを「氏名」と「電話番号」のフィールドを持った個人情報テーブルと,「会社名」のフィールドだけを持った会社情報テーブルに分割してみましょう。これによって,同じ値を持つフィールドを複数のレコードに登録できてしまうことが防げます。こうすると,「日経BP社」というフィールドが一つだけになります(図5)

図5●電話帳テーブルを2つに分割する

次回は,二つのテーブルの関連性について解説します。