- PR -

データベース設計について教えてください

1
投稿者投稿内容
BW
会議室デビュー日: 2007/06/25
投稿数: 6
投稿日時: 2008-01-30 15:24
現在、PostgreSQL8を利用してアプリケーションを作ろうと思っているのですが、データベースの設計に悩んでいます。

■店舗テーブル
店舗ID|店舗名
--------------
100000|あいう
100001|かきく

■特徴テーブル
特徴ID|特徴名
--------------
0|特徴1
1|特徴2

■店舗-特徴テーブル
店舗ID|特徴ID
--------------
100000| 0
100001| 0
100001| 1

「特徴」の項目数が固定であれば、店舗テーブル内に「特徴1」「特徴2」のようなカラムを設定して1つのテーブルにまとめる事も可能なのですが、「特徴」の項目自体は増減する事があるので3つのテーブルに分けました。

ただ、そうすると「特徴」項目で検索をするときに、1つのSQLだと検索が出来なくなってしまいました。アプリケーション側で、なんとかすることはできるのですが、データベースだけで解決する方法はないでしょうか?

例)特徴に特徴ID「0」と「1」がある店舗IDを知りたい
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2008-01-30 15:36
こんなんじゃだめですかね。
コード:
SELECT TBL0.店舗ID
  FROM 店舗-特徴テーブル AS TBL0
 INNER JOIN 店舗-特徴テーブル AS TBL1 ON TBL1.特徴ID = 1 AND TBL1.店舗ID = TBL0.店舗ID
 WHERE TBL0.特徴ID = 0


動作確認はしてませんけど。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-01-30 16:15
指定する特徴が増えた場合を考えると
一郎様の提示コードでは、対応しきれないかもしれませんね。


私の提示コードも、ちょっと無理矢理すぎるかもしれませんが・・・。

店舗-特徴テーブルのキーが店舗ID+特徴IDであるという前提で・・・
コード:
SELECT TBL0.店舗ID
FROM 店舗-特徴テーブル AS TBL0
WHERE TBL0.特徴ID In(0,1)
GROUP BY TBL0.店舗ID
HAVING Count(*) = 2


で、どうでしょうかね。
特徴IDはIn句で。HAVINGでIn句に使った特徴の数を指定。
地図
会議室デビュー日: 2007/12/26
投稿数: 12
投稿日時: 2008-01-30 16:48
引用:

「特徴」の項目数が固定であれば、店舗テーブル内に「特徴1」「特徴2」のようなカラムを設定して1つのテーブルにまとめる事も可能なのですが、「特徴」の項目自体は増減する事があるので3つのテーブルに分けました。


仕様として疑問・・・
「特徴」「特徴2」のカラムなんて持つ必要ないんじゃないですか?
そもそも店舗には必ず特徴があるんですよね?
店舗テーブルに
特徴IDをもてばいいのでは?
引用:

例)特徴に特徴ID「0」と「1」がある店舗IDを知りたい


上記のテーブル構造なら問題なしですね。。

[ メッセージ編集済み 編集者: 地図 編集日時 2008-01-30 16:55 ]
johnes
ベテラン
会議室デビュー日: 2007/11/21
投稿数: 50
投稿日時: 2008-01-30 17:15
これって設計の話ですよね。
せっかくなので配列を使うのではダメですか?

■店舗テーブル
店舗ID|店舗名|特徴ID
-----------------------
100000|あいう|ARRAY[0]
100001|かきく|ARRAY[0, 1]

■特徴テーブル
特徴ID|特徴名
--------------
0|特徴1
1|特徴2
上総
大ベテラン
会議室デビュー日: 2006/06/22
投稿数: 107
投稿日時: 2008-01-30 17:22
引用:

スレ主さんの書き込み(2008-01-30 15:24)より
例)特徴に特徴ID「0」と「1」がある店舗IDを知りたい



上記の条件を満たすSQLでよければ下記のSQLを参考にして下さい。
今回は特徴IDに0と1が設定されているものとの事でしたので、INTERSECT演算子を使用
してSQL文を繋げています。
単一の特徴IDを検索する場合は、SQLを分けて使用するとよいかと。
コード:
SELECT      ALL
            店舗ID
FROM        店舗-特徴テーブル
WHERE       特徴ID = 0
INTERSECT
SELECT      ALL
            店舗ID
FROM        店舗-特徴テーブル
WHERE       特徴ID = 1

BW
会議室デビュー日: 2007/06/25
投稿数: 6
投稿日時: 2008-01-30 17:35
みなさま、アドバイスありがとうございます。
INTERSECT演算子In句というのがあるのを初めて知りました。
これであればこのテーブル構造のまま目的が達成できそうです。

また、複数項目を一つの絡むに収めるために配列を使うという発想もありませんでした。
テストとして色々と試してみたいと思います。

本当にありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)