[pgsql-jp: 35393] Re: [pgsql-jp: 35391 データベースのテーブル設計について
Ryosuke Hosoi
hosoi @ ryo.com
2005年 5月 18日 (水) 04:09:56 JST
細井です
From: KITAO Kaoru <kitao @ netcube.jp>
Subject: [pgsql-jp: 35391] データベースのテーブル設計について
Date: Wed, 18 May 2005 00:07:34 +0900
Message-ID: <200505171507.AA00588 @ T42.netcube.jp>
> 私は二つの方法を考えました。
> ■方法その一
> 一つのテーブルで対応する。
> create table tbl_hotel (
> hotel_id serial primary key,
> hotel_name text,
> bihin_1 bool,
> bihin_2 bool,
> bihin_3 bool
> );
>
> 上記の方法が単純と思えたのですが、備品が増えたときに列を増やす必要があります。また減
> る可能性もあります。コレでも問題ないとは思うのですが、そもそも列を増やしたり減らした
> りすることを当初から想定してテーブルを設計するのがよいのかどうか、と考えました。
さすがに列を増やしたり減らしたりすることを想定したらそれは
テーブル設計とはいえないですよ。
phpで列を増やしたり減らしたりすることを想定したコードを
書けないこともないですけど、本来の処理を行うコードより、
そこでの対応のほうが大変になりそう。。。
> そこで代替えとして以下の方法を思いつきました。
# いらぬ突っ込みですいませんが、実は私も以前「代替(だいたい)」を
#「だいかえ」と読んでしまってました
> ■方法その二
> 三つのテーブルで対応する。
> 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のいずれも
> 重複が多く、はたして効率的かどうか(インデックスを作成すればそれだけでいいのか)私に
> はわかりません。
>
> そこでお教え願いたいのですが、上記二つの方法のいずれがよろしいのでしょうか(私は二つ
> 目のほうがベターと思いました)。またその他に、より一般的なテーブル構成があるのでしょ
> うか。
北尾さんの考えのとおり、こちらのほうがベターですし、一般的です。
けど、これ、'tbl_relation'に主キーが設定されてないです。
方法その一から考えるに、tbl_relationは
PRIMARY KEY (hotei_id, bihin_id)
となるべきかと。
> 経験豊富な方からすれば愚問かもしれませんが、お教え願えればと存じます。また参考となり
> そうなサイトや「マニュアルのここを読め」などポインタをご指摘いただければ幸いです。
データベース設計については、サイトやマニュアルというよりは、
データベース設計/データモデリングの本や講座などで、一通り
勉強されることを強くおすすめします。
サイトやマニュアルで勉強しながら、という感覚で設計された
データベースは、やっぱりけっこう破綻しやすいです^^;
--
Ryosuke Hosoi / 細井 良祐
mailto:hosoi @ ryo.com http://www.ryo.com/
PGP Public Key http://www.ryo.com/ryo/hosoi.ryo.com.asc
fingerprint = 4F39 61B0 2034 3A5C DFE8 FBCB 7B99 90CF EBE1 A3F3
pgsql-jp メーリングリストの案内