[pgsql-jp: 35391] データベースのテーブル設計について

KITAO Kaoru kitao @ netcube.jp
2005年 5月 18日 (水) 00:07:34 JST


北尾と申します。お世話になります。

データベースの作成(テーブルの作り方)についての質問です。どちらかというとデータベー
ス全般に関する話題ですが、ふさわしそうなMLを見つけることができませんでしたので、こち
らに投稿させていただきました。よりふさわしいMLをご存知の方がいらっしゃればご指摘願え
ればと存じます。

ホテルのデータベースを作成すると仮定します。ホテルにはいろいろな備品がありますが、そ
れらの有無により検索が可能となるようなシステムを作ることが最終目的です。
構築する環境は決まっていませんが、Linux環境、postgresql7.3系(または7.4系)、PHP4.3系、
apacheにて構築するとの仮定でお願いします。

私は二つの方法を考えました。
■方法その一
一つのテーブルで対応する。
create table tbl_hotel (
 hotel_id serial primary key,
 hotel_name text,
 bihin_1 bool,
 bihin_2 bool,
 bihin_3 bool
);

上記の方法が単純と思えたのですが、備品が増えたときに列を増やす必要があります。また減
る可能性もあります。コレでも問題ないとは思うのですが、そもそも列を増やしたり減らした
りすることを当初から想定してテーブルを設計するのがよいのかどうか、と考えました。
そこで代替えとして以下の方法を思いつきました。

■方法その二
三つのテーブルで対応する。
create table tbl_hotel (
 hotel_id serial primary key,
 hotel_name text
);

create table tbl_bihin (
 bihin_id serial primary key,
 bihin_name text
);

create table tbl_relation (
 hotel_id integer references tbl_hotel(hotel_id) on delete cascade,
 bihin_id integer references tbl_bihin(bihin_id) on delete cascade
);

こちらの方法ですと、テーブルの列を増やす必要がありません。検索には主にtbl_relationが
使われると考えています。しかしテーブルtbl_relationの列でhotel_id、bihin_idのいずれも
重複が多く、はたして効率的かどうか(インデックスを作成すればそれだけでいいのか)私に
はわかりません。

そこでお教え願いたいのですが、上記二つの方法のいずれがよろしいのでしょうか(私は二つ
目のほうがベターと思いました)。またその他に、より一般的なテーブル構成があるのでしょ
うか。

経験豊富な方からすれば愚問かもしれませんが、お教え願えればと存じます。また参考となり
そうなサイトや「マニュアルのここを読め」などポインタをご指摘いただければ幸いです。

どうぞよろしくお願いします。

-------------------------------------------
KITAO Kaoru (Ibaraki Pref.)





pgsql-jp メーリングリストの案内