step04 実習:複数のテーブルからなるDBの設計

なぜ複数のテーブルが必要になるのか

step03では、単一のテーブル(からなるDB)をいくつか設計した。いくつかのテーマで、現実世界の事柄をテーブルの形で表現できることを確かめた。
だがテーマによっては、うまく表現できたとは言いにくいものもあった。たとえば、付せんDBに1レコードを追加するのには、本に1枚の付せんを貼るのにくらべて10倍くらいの手間と時間を食いそうだ。データベースに限らずICTは、省力化の手段であるはずなのに、逆に手間が増えるなんて、一体どうしたことだ?
その理由は、現実の付せんを貼るときにはしない作業がテーブルへのレコード追加に含まれていることにある。本のタイトルや著者を書くとか。これは本来、どの本かが分かれば不要な作業である。だが、単一テーブルしか使えない場合は、どうしようもない。
そう考えてくると、テーマによっては、複数のテーブルにデータを分散して格納し、テーブル間をリレーションシップで関連づける形式にする方が便利なことがわかる。付せんの場合は、本の書誌情報は蔵書テーブルに任せて、付せんテーブルからはそれを参照すればよい。こうすることで、付せんデータ追加の手間が劇的に削減されるばかりか、データ内容の重複が減り、1つのデータは1カ所に格納できる。これは、データベース設計の大原則(Grand Principle)なので、改めて以下に掲げておこう。


GP1. 1つのデータは、1つのテーブルの、1つのフィールドにのみ格納する。
   1 fact in 1place.

リレーションシップと参照整合性

リレーションシップとは、複数のテーブルのフィールド間の関連のことである。同じテーブルの異なるフィールドにリレーションシップを張ることもある。RDBに限らず、一般的に捉えたデータ間のリレーションシップには、以下の3種類がある。

1対1(1:1)のリレーションシップ
たとえば、学生の名簿と成績表は、レコードが必ず1対1に対応する。この場合、複数テーブルに分けるより、1つのテーブルに格納するのが普通である。
1対多(1:n)のリレーションシップ
1冊の本には複数の付せんを貼れるが、1枚の付せんを複数の本には貼れない。このとき、本を1側、付せんを多側(n側)として、1対多のリレーションを張る。一般にRDBにおけるリレーションシップは、特別な場合に使われる1対1と、この1対多の2種類だけである。
多対多(n:n)のリレーションシップ
学生と履修科目の関係がこれにあたる。図4-1に示す通り、1人の学生は複数の科目を履修でき、1科目は複数の学生によって履修される。したがって、2つのテーブル間のレコードの対応は、図のように入り乱れる。RDBでは、フィールドの値として集合値(複数の値の列挙)を認めないので、こうしたリレーションシップを直接表現できない。これは、履修といった中間テーブルを作ることで解決できる。

図4-1: n対nのリレーションシップは、RDBで直接表現できない

単一のテーブルでは、データの誤記などにより不整合が生ずるが、複数テーブルの場合、個々のテーブルに間違いが無くても、参照関係に基づいて不整合が起きる場合がある。これを図4-2に示す。

図4-2: 複数テーブルの参照に基づく不整合

テーブル間に関連があることを、Accessの機能(リレーションシップ主キー)で設定・通知してやると、それに基づいて、参照整合性に関わるチェックや自動的修正などのサービスが受けられる。複雑なデータベースになると、これを自分でチェックするのは至難の技といってよく、これらの機能は極めてありがたい、つまり神機能である。

図4-3: 参照整合性を保つためのデータベースの機能

演習:複数のテーブルからなるデータベース(のテーブル)設計

つぎの2つの題材について、複数のテーブルからなるデータベースを設計してみよう。

  1. 実習1の蔵書カード付せんを関連づけた2テーブルのデータベース
  2. 学生名簿テーブルと科目一覧表テーブルからなるデータベース(このリンクからダウンロードすること)を、履修登録の情報(どの学生がどの科目の履修を登録したか)を管理するために拡張してみよ

テーブル設計のまとめ

以上、3stepにわたって、みっちりとテーブル設計の基本を学んだ。それは、実世界の、扱いたいテーマを見て、そのデータを格納する適切な入れ物を考えるという、データベース化作業のすべてが、テーブル設計に集約されているからである。
データベースの基本を学び、自分の知的生産活動に必要なデータベースを作成・活用できるようになれば、ICTの利用スキルは大きく向上したといえる。
本格的な情報システムで利用されるデータベースを設計するには、性能セキュリティのことも徹底して考えねばならないが、たかだか数万レコードを格納する個人用DBなら、MS Accessで気軽に作り、活用できる。使っているうちに、クエリの実行性能などに不満を覚えたら、改めてインデックスの付与など、高度な機能を習得すればよい。
課題レポートを挟んで、step06では、教科書を用い、4つのデータベース・オブジェクト(テーブル、クエリ、フォーム、レポート)をすべて含むデータベースを完成させて、MS Accessの機能を一通り習得することにしよう。