例題として、複数メンバーの予定を管理するアプリケーション用の 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 | 出初め式
以上です。
1.5.7.1