サンプル データベース テーブルと参照整合性
この付録では以下の項目について説明します。
Demodata サンプル データベースの概要
サンプル データベースの Demodata は Zen 製品の一部として提供されており、データベースの概念と技法を図解するためにマニュアルで頻繁に使用されます。Zen に関しては既によく理解されていると思いますが、この付録の情報をもう一度見直して、新しいサンプル データベースに慣れてください。
大学関連の環境で仕事をしていなくても、これらのサンプル データベースの例をテンプレートおよび参考として利用すれば、独自の情報システムの設計と開発を容易に行えます。ここに示す例は実際の生活の場面を反映しているので、この例に示すサンプル クエリなど機能を利用することができます。
Demodata サンプル データベースの構造
データベースの物理構造は、リレーショナル データベースの要素であるテーブル、列、行、キー、インデックスで構成されています。
このデータベースに含まれる 10 個のテーブル間にはさまざまな関係があります。このデータベースには、学生、教職員、授業、登録などに関するデータが含まれています。
前提条件
以下に、データベースを構築したときのいくつかの前提条件を示します。
エンティティの関係
エンティティは、データベース内の主なコンポーネントを記述するオブジェクトです。データベースを設計する場合、エンティティとそれらの相互の関係を定義してから先に進むことが大切です。Demodata データベースでは、CLASSES、STUDENTS、FACULTY、GRADES などがエンティティです。エンティティとそれらの相互関係について、次の図で概説しています。
図 3 エンティティの関係
GRADES は弱いエンティティです。このエンティティは授業を受ける学生に依存しているので、その存在は他のエンティティの有効性に依存しています。STUDENT テーブルと FACULTY テーブルが共通の情報を作成するのは、学生が教職員になったり、教職員が学生になる場合があるからです。共通の情報は、PERSON テーブルにあります。
Demodata データベースの参照整合性の例
このトピックでは、Demodata サンプル データベースに適用される参照整合性設計について説明します。また、Demodata サンプル データベースにこの設計を実装できる SQL スクリプトが含まれています。
次の図は、Demodata 内のテーブル間の一連の参照を示しています。ボックスはテーブルを表します。矢印は、親テーブルから参照元テーブルへの参照制約を示します。たとえば、制約 1 では、親テーブルの外部キーは Billing テーブルの主キーを参照しています。
メモ:この図は、依存関係グラフの役割も果たし、どのような順序でテーブルを作成すれば、テーブルの相互の参照が有効になるかを示します。この順序は SQL スクリプトに反映されます。
次の表は、これらの制約、およびテーブルと列の間の関係を示します。
次のスクリプトにより、このトピックで説明されている参照が実装されます。スクリプトをコピーして ZenCC で貼り付け、Demodata に適用することができます。Demodata のコピーを作成し、そのコピーに対してスクリプトを使用することをお勧めします。
ALTER TABLE Person (ADD PRIMARY KEY (ID)); -- 既存の PersonID インデックスを使用します
ALTER TABLE Billing ADD CONSTRAINT Billing_Person FOREIGN KEY (Registrar_ID)
   REFERENCES Person ON DELETE RESTRICT; -- 新しい Billing_Person インデックスを作成します
ALTER TABLE Student ADD CONSTRAINT Student_Person FOREIGN KEY (ID)
   REFERENCES Person ON DELETE RESTRICT; -- 既存の StudentID インデックスを使用します
ALTER TABLE Faculty ADD CONSTRAINT Faculty_Person FOREIGN KEY (ID)
   REFERENCES Person ON DELETE RESTRICT; -- 既存の FacultyID インデックスを使用します
ALTER TABLE Tuition (ADD PRIMARY KEY (ID)); -- 既存の UK_ID インデックスを使用します
ALTER TABLE Student ADD CONSTRAINT Student_Tuition FOREIGN KEY (Tuition_ID)
   REFERENCES Tuition ON DELETE RESTRICT; -- 既存の TuitionID インデックスを使用します
ALTER TABLE Room (MODIFY Building_Name CHAR(25) NOT NULL); -- 主キーは NULL でない必要があります
ALTER TABLE Room (MODIFY Number UINTEGER NOT NULL); -- 主キーは NULL でない必要があります
ALTER TABLE Room (ADD PRIMARY KEY (Building_Name, Number)); -- 既存の Building_Number インデックスを使用します
ALTER TABLE Faculty ADD CONSTRAINT Faculty_Room FOREIGN KEY (Building_Name, Room_Number)
   REFERENCES Room ON DELETE RESTRICT; -- 既存の Building_Room インデックスを使用します
ALTER TABLE Dept ADD CONSTRAINT Dept_Room FOREIGN KEY (Building_Name, Room_Number)
   REFERENCES Room ON DELETE RESTRICT; -- 既存の Building_Room インデックスを使用します
ALTER TABLE Class ADD CONSTRAINT Class_Room FOREIGN KEY (Building_Name, Room_Number)
   REFERENCES Room ON DELETE RESTRICT; -- 新しい Class_Room インデックスを作成します
ALTER TABLE Dept (ADD PRIMARY KEY (Name)); -- 既存の Dept_Name インデックスを使用します
ALTER TABLE Faculty ADD CONSTRAINT Faculty_Dept FOREIGN KEY (Dept_Name)
   REFERENCES Dept ON DELETE RESTRICT; -- 既存の Dept インデックスを使用します
ALTER TABLE Student ADD CONSTRAINT Student_Dept_Major FOREIGN KEY (Major)
   REFERENCES Dept ON DELETE RESTRICT; -- 新しい Student_Dept_Major インデックスを作成します
ALTER TABLE Student ADD CONSTRAINT Student_Dept_Minor FOREIGN KEY (Minor)
   REFERENCES Dept ON DELETE RESTRICT; -- 新しい Student_Dept_Minor インデックスを作成します
ALTER TABLE Course ADD CONSTRAINT Course_Dept FOREIGN KEY (Dept_Name)
   REFERENCES Dept ON DELETE RESTRICT; -- 既存の DeptName インデックスを使用します
ALTER TABLE Faculty (ADD PRIMARY KEY (ID)); -- 既存の FacultyID インデックスを使用します
ALTER TABLE Dept ADD CONSTRAINT Dept_Faculty FOREIGN KEY (Head_Of_Dept)
   REFERENCES Faculty ON DELETE RESTRICT; -- 既存の Dept インデックスを使用します
ALTER TABLE Class ADD CONSTRAINT Class_Faculty FOREIGN KEY (Faculty_ID)
   REFERENCES Faculty ON DELETE RESTRICT; -- 新しい Class_Faculty インデックスを作成します
ALTER TABLE Student (ADD PRIMARY KEY (ID)); -- 既存の StudentID インデックスを使用します
ALTER TABLE Billing ADD CONSTRAINT Billing_Student FOREIGN KEY (Student_ID)
   REFERENCES Student ON DELETE RESTRICT; -- 新しい Billing_Student インデックスを作成します
ALTER TABLE Enrolls ADD CONSTRAINT Enrolls_Student FOREIGN KEY (Student_ID)
   REFERENCES Student ON DELETE RESTRICT; -- 既存の StudentID インデックスを使用します
ALTER TABLE Course (ADD PRIMARY KEY (Name)); -- 既存の Course_Name インデックスを使用します
ALTER TABLE Class ADD CONSTRAINT Class_Course FOREIGN KEY (Name)
   REFERENCES Course ON DELETE RESTRICT; -- 新しい Class_Course インデックスを作成します
ALTER TABLE Class (ADD PRIMARY KEY (ID)); -- 既存の UK_ID インデックスを使用します
ALTER TABLE Enrolls ADD CONSTRAINT Enrolls_Class FOREIGN KEY (Class_ID)
   REFERENCES Class ON DELETE RESTRICT; -- 新しい ClassID インデックスを作成します
Demodata サンプル データベースのテーブル設計
以下に、Demodata サンプル データベースのテーブルに関するガイドを示します。以下の情報は、各テーブルに収録されています。
BILLING テーブル
 
CLASS テーブル
 
COURSE テーブル
 
DEPT テーブル
 
ENROLLS テーブル
 
FACULTY テーブル
 
PERSON テーブル
ROOM テーブル
 
STUDENT テーブル
 
TUITION テーブル