テーブル作成
まずは、DBMS上で今回使用するテーブルを作成します。前回の記事で作成したデータベースdb_zend_tableに新たなテーブルを作成し、レコードを追加します。プログラムからデータベースにアクセスする際は、前回作成したユーザーzendを使用します。データベースとユーザーの作成を行っていない場合は、前回の記事を参照して先に作成してください。
オフィス内の部屋に入室する権限を管理する例を想定して、4個のテーブルを作成します。作成するテーブルと内容は次のとおりです。テーブル名は複数形で頭文字のみ大文字にしています。
テーブル名 | 内容 |
Offices | オフィスの情報を格納します。 |
Rooms | 管理の対象となる部屋の情報を格納します。 |
Members | 管理の対象となるメンバーの情報を格納します。 |
Permissions | メンバーが持っている入室権限と有効期限を格納します。 |
各テーブルの列は次のようになっています。
列名 | キー | 内容 |
office_id | PK | オフィスに割り振ったユニークな番号。 |
office_name | - | オフィス名の文字列。 |
列名 | キー | 内容 |
room_id | PK | 部屋に割り振った番号。オフィス内ではなく、全体で重複しない値とします。 |
room_name | - | 部屋名の文字列。 |
office_id | FK | その部屋があるオフィスのoffice_id。Officeテーブルのoffice_id列を指す外部キーです。 |
列名 | キー | 内容 |
member_id | PK | メンバーに割り振ったユニークな番号。 |
member_name | - | メンバーの名前の文字列。 |
列名 | キー | 内容 |
member_id | PK,FK | 「誰が」部屋に入る権限を持っているかを示す値。member_idとroom_idの組み合わせがこのテーブルの主キーになります。Membersテーブルのmember_idを指す外部キーです。 |
room_id | PK,FK | 「どの部屋に」入る権限を持っているかを示す値。member_idとroom_idの組み合わせがこのテーブルの主キーになります。Roomsテーブルのroomr_idを指す外部キーです。 |
term | - | 入室権限の有効期限をあらわす日付型の値。 |
ER図は次のようになります。
MySQLのコマンドラインツールから次のSQLを実行し、テーブルを作成してレコードを投入します。
-- データベースdb_zend_sampleを使用します use db_zend_sample; -- テーブルを作ります CREATE TABLE Offices( office_id int primary key, office_name varchar(50) ) engine = InnoDB; CREATE TABLE Rooms( room_id int primary key, room_name varchar(50), office_id int, CONSTRAINT rooms_fk foreign key(office_id) REFERENCES offices(office_id) ) engine = InnoDB; CREATE TABLE Members( member_id int primary key, member_name varchar(50) ) engine = InnoDB; CREATE TABLE Permissions( member_id int, room_id int, term date, CONSTRAINT permissions_pk primary key(member_id, room_id), CONSTRAINT permissions_fk1 foreign key(member_id) REFERENCES members(member_id), CONSTRAINT permissions_fk2 foreign key(room_id) REFERENCES rooms(room_id) ) engine = InnoDB; -- レコードを追加します INSERT INTO offices VALUES(1, '池袋本社'); INSERT INTO offices VALUES(2, '品川分室'); INSERT INTO rooms VALUES(1, 'サーバ室', 1); INSERT INTO rooms VALUES(2, '資料室', 1); INSERT INTO rooms VALUES(3, 'サーバ室', 2); INSERT INTO members VALUES(1, '織田'); INSERT INTO members VALUES(2, '柴田'); INSERT INTO members VALUES(3, '前田'); INSERT INTO permissions VALUES(1, 1, '2009-03-31'); INSERT INTO permissions VALUES(1, 2, '2009-03-31'); INSERT INTO permissions VALUES(2, 3, '2009-03-31'); INSERT INTO permissions VALUES(3, 1, '2009-03-31'); INSERT INTO permissions VALUES(3, 3, '2008-09-30');
レコードの内容を表にまとめると次のようになります。
office_id | 1 | 2 | ||
office_name | 池袋本社 | 品川分室 | ||
room_id | 1 | 2 | 3 | |
member_id | room_name member_name | サーバ室 | 資料室 | サーバ室 |
1 | 織田 | 2009/03/31 | 2009/03/31 | - |
2 | 柴田 | - | - | 2009/03/31 |
3 | 前田 | 2009/03/31 | - | 2008/09/30 |