[pgsql-jp: 29404] 効率的なWebアプリケーションの為にDB設計について(長文)
みのむし
minoran @ lily.freemail.ne.jp
2003年 3月 14日 (金) 00:57:20 JST
いつもお勉強をさせて頂いております。
みのむしと申します。
たいそうなサブジェクトですが質問内容は初歩的な
事とは思いますが教えてください。
現在、LinuxにApacheとPHP4.2.4を使い、Webアプリケーションを
開発しています。PostgreSQLのバージョンは7.1.3です。
現在以下のようなテーブルがあります。
memberテーブル
member_id | member_name
----------+------------
A0001 |田中さん
A0002 |山田さん
B0001 |鈴木さん
B0002 |高橋さん
B0003 |佐藤さん
C0001 |斉藤さん
placeテーブル
p_id | p_name
-----+-------
1 |京都
2 |鎌倉
3 |浅草
t_groupテーブル
g_id | member_id1 | member_id2
-----+------------+-----------
g1 | A0001 | C0001
g2 | B0002 | C0001
g3 | A0002 | B0003
keiyakuテーブル
keiyaku_id | p_id | g_id
-----------+------+------
20030313001| 1 | g2
20030313002| 3 | g3
という4つのテーブルがあります。
ここでアプリケーション側にkeiyakuテーブルを基本とした一覧を出力させたい
のですがどのようなSQLを実行するのが一番スマートかというので悩んでいます。
期待する結果としては
keiyaku_id | p_name | member_name1 | member_name2
------------+--------+--------------+-----------
20030313001 | 京都 | 鈴木さん | 斉藤さん
20030313002 | 浅草 | 山田さん | 佐藤さん
という感じです。
select
keiyaku.keiyaku_id,
place.p_name,
member.member_name AS member_name1,
t_group.member_id2
from
member,
keiyaku,
place,
t_group
where
t_group.member_id1 = member.member_id and
t_group.g_id = keiyaku.g_id and
place.p_id = keiyaku.p_id
;
として
keiyaku_id | p_name | member_name1 | member_id2
-------------+--------+--------------+------------
20030313001 | 京都 | 高橋さん | C0001
20030313002 | 浅草 | 山田さん | B0003
までたどり着く事が出来ましたがmember_id2を名前表示にしたいのです。
いろいろ考えてみてmemberテーブルにg_idカラムを付けようかと思ったのですが
これは既存のDBの部分なので手が入れられません。
何かいい方法があれば教えてください。
またPHPなどのWeb開発では上記のようなケースで一覧表示をさせる
事が多々あるかと思います。
一覧表示をさせたい結果が一回のSQLで得られるのであればその結果を
元にviewを作りviewテーブルをPHP側から見にいかせる方法か、
それとも参照するその都度、その都度で同じような長いSQL文を
実行させる方がよいのか迷っています。
viewテーブルというのは参照元テーブルが更新された場合は
テーブルの再構築をそのたびに行うので処理的にはかなり
負担がかかるものなのでしょうか。
もし負荷がかかりやすいという事であれば一回一回
SQLを走査させる方法しかないように思います。
みなさんはどのようにしておられるのでしょうか。
長くなりましたがよろしくお願いいたします。
-----------------------
みのむし
pgsql-jp メーリングリストの案内