テーブルの定義について

情報のテーブル化

では、管理したい情報をどのように実際の DB で表現していくかについて見ていきましょう。

例題として、複数メンバーの予定を管理するアプリケーション用の DB を設計してみましょう。予定としては「日時、用事」を管理することとし、各メンバー毎に「学籍番号、名前、所属、電話番号」を管理するとします。また、予定の時刻は省略可能とします


リレーションの定義

まず、予定を管理するリレーションと個人情報を管理するリレーションは分割するものとします。最初に、個人情報を管理するリレーションを定義しましょう。

リレーションを定義するにあたっては、何を出力したいのかを思い描くと良いでしょう。この場合、先に示した例が作りたいリレーションのイメージです。

表現したいことが決まったので、実際のデータ型を定義してみましょう。

  CREATE TABLE personal (
        student_id char(4),
        name text,
        attribute text,
        phone_number text ); 

とりあえずのデータ定義ではこんな感じでしょう。
次は、予定の方のテーブル定義です。予定の方は、何も考えずにテーブルを定義するとこんな感じでしょうか。

  CREATE TABLE schedule (
        name text,
        begin_time timestamp,
        end_time timestamp,
        title text ); 

さて、ここで問題ですが、上記2つのテーブルを改善するとしたら、ずばりどこ?
ちょっと考えてみて下さい。

.
.
.

では、解答編です。とりあえず列挙します。

以下、それぞれについての説明です。


主キー

主キーとはリレーション毎の概念で、そのリレーションのレコードを一意に指定できる要素のことです。この場合、学籍番号の重複が存在しないので、学籍番号は主キーたりえます。主キーはそのリレーション内に1つしか存在しません。また、主キーから同じレコードの他の要素を指定することもできます。例えば、「0001 の人の電話番号は 117」とか、「0001 の人の所属は 気象衛星課」といった感じです。


NOT NULL 制約

その項目が空ではないことを保証します。この場合、personal テーブルにおける名前や、schedule テーブルにおける予定の表示名がない、ということはそのレコード自体に意味がなくなるので、NOT NULL 制約を付けましょう。予定の日付についても、NOT NULL 制約を適用します。


外部キー

これは、その要素が他のテーブルに必ず存在することを保証します。今回の schedule は「誰か」の予定を表しているはずなので、その「誰か」は必ず存在することを保証します。


Default 制約

今回は出てきませんでしたが、レコード追加時に要素が省略された場合、その要素の初期値を指定できます。


宿題

以下のテーブル定義、サンプルデータが与えられたときに、以下の SQL 問い合わせを作成せよ。

以上です。


Generated on Mon Apr 13 22:52:06 2009 by  doxygen 1.5.7.1