[pgsql-jp: 31112] VIEW、継承などを使ったPHPアプリのDB設計

kenbooit @ excite.co.jp kenbooit @ excite.co.jp
2003年 9月 24日 (水) 13:39:15 JST


島田と申します。
いつもお世話になってます。

以下のようなテーブルがあったとします。
カラム
・kind
・id
・name
は全てのテーブルで共通ですが、
その他のものは、別物であり、カラム数もそれぞれ異なります。

create table list1(
kind text default 'list1',
id int,
name text,
comment1a text,
comment1b text,
primary key(id)
)

create table list2(
kind text default 'list2',
id int,
name text,
comment2a text,
comment2b text,
comment2c text,
primary key(id)
)

create table list3(
kind text default 'list3',
id int,
name text,
comment3a text,
comment3b text,
comment3c text,
comment3d text,
primary key(id)
)

PHPで検索する際には
3つのテーブルを合体したものを対象にしたいため、

create view list_all as
select kind, id, name from list1
union
select kind, id, name from list2
union
select kind, id, name from list3

なんてVIEWを作っています(idは同じシーケンスを使っている為、viewにおいてもUNIQUE)。

PHPではこのVIEWを検索 → 一覧表示し、
詳細を見たい場合は、IDをキーにして詳細リンクをクリックさせ、
それぞれのテーブルを見させています。
この時どのテーブルを見に行くかを判別させる為に、
上のテーブルのようにDEFAULT句で同一キーワードを入れて、対処しています。

if ($kind == "list1) {
	$sql = " SELECT * FROM list1 ";
}

みたいな。


・kind
・id
・name
は共通だから継承を使って、

create table master_list (
kind text,
id int,
name text
);

create table i_list1(
comment1a text,
comment1b text
) inherits (master_list);

create table i_list2(
comment2a text,
comment2b text
) inherits (master_list);

create table i_list3(
comment3a text,
comment3b text
) inherits (master_list);

といったものもすぐに思いつきそうですが、
PHPで詳細表示する手順は結局変わらないような・・・。

質問の内容としては、VIEWを検索した時に、
各レコードに自身のテーブル名を保持する機能が付いていて、
#「pg_????」みたいな。マニュアルを見ましたが、みつかりませんでした。
その値によって、詳細表示の際に見るテーブルを区別することができれば、
カラムkindという限りになく無駄に感じるカラムはなくなっていいなあ、などと
考えているのですが。

このようなケース、どうするのが一番賢いでしょうか。
・現行の方法でいいのか。
・継承を使った方がいいのか。
・あるいはもっと他にいい方法がるのか。

PHP要素も入ってしまっていて、申し訳ありませんが、
ご教授頂ければと思います。
よろしくお願い致します。



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