例題として、複数メンバーの予定を管理するアプリケーション用の DB を設計してみましょう。予定としては「日時、用事」を管理することとし、各メンバー毎に「学籍番号、名前、所属、電話番号」を管理するとします。また、予定の時刻は省略可能とします
名前 | 1 | 2 | 3 | 4 |
てん子 | meeting | |||
けい子 | meeting | 1日署長 | ||
しょう太 | meeting | 10:00 出初め式 |
学籍番号 | 名前 | 所属 | 電話番号 |
0001 | てん子 | 気象衛星課 | 117 |
0002 | けい子 | 警察課 | 110 |
0003 | しょう太 | 消防課 | 119 |
リレーションを定義するにあたっては、何を出力したいのかを思い描くと良いでしょう。この場合、先に示した例が作りたいリレーションのイメージです。
表現したいことが決まったので、実際のデータ型を定義してみましょう。
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つのテーブルを改善するとしたら、ずばりどこ?
ちょっと考えてみて下さい。
.
.
.
では、解答編です。とりあえず列挙します。
以下、それぞれについての説明です。
CREATE TABLE db2_personal (
student_id char(4) PRIMARY KEY,
name text NOT NULL,
attribute text,
phone_number text);
CREATE TABLE db2_schedule (
student_id char(4),
begin_time timestamp NOT NULL,
end_time timestamp,
title text NOT NULL,
FOREIGN KEY (student_id) REFERENCES db2_personal);
name | begin_time | end_time | title ----------+---------------------+---------------------+---------- しょう太 | 2005-11-01 00:00:00 | 2005-11-01 00:00:00 | meeting しょう太 | 2005-11-03 00:00:00 | 2005-11-03 00:00:00 | 出初め式
以上です。