[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 メーリングリストの案内