- ベストアンサー
DB設計方法
MS-SQLServer7.0を使用してASPと連動したHPを製作しております。 1つの製品情報に複数の製品カテゴリ(1~5個まで)と 1つのスペックを登録し、このデータベースから製品カテゴリの前方一致検索を可能にする場合、製品カテゴリは別テーブルにあると仮定して列名を次のうちどちらにしたほうが良いか教えてください。 =====例1===== 製品ID|カテゴリID|スペック| =====例2===== 製品ID|カテゴリID-1|カテゴリID-2|カテゴリID-3|カテゴリID-4|カテゴリID-5|スペック|
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
・例1 SELECT 製品ID, 登録日 FROM 製品情報テーブル, カテゴリテーブル WHERE 製品情報テーブル.カテゴリID = カテゴリテーブル.カテゴリID AND カテゴリテーブル.カテゴリ名 LIKE :KNAME ORDER BY 製品情報テーブル.登録日 ※検索条件 :KNAME ・・・ 'XXX%' ・正規化後の場合 SELECT 製品ID, 登録日 FROM 製品情報テーブル, カテゴリテーブル, 製品カテゴリテーブル WHERE 製品カテゴリテーブル.カテゴリID = カテゴリテーブル.カテゴリID AND 製品情報テーブル.製品ID = 製品カテゴリテーブル.製品ID AND カテゴリテーブル.カテゴリ名 LIKE :KNAME ORDER BY 製品情報テーブル.登録日 ※検索条件 :KNAME ・・・ 'XXX%' 楽な方にして下さい。 どっか間違ってたら誰か指摘して下さい。 机上で間違えるとかなり恥ずかしい。 例1のままにするのか、正規化するのかはフィールドを 洗い出してから決めたらいいと思います。 SQLはパフォーマンスを考えるときに考えて下さい。 どんな簡単な部分でも、悩み始めると止まりませんから。
その他の回答 (5)
- vient
- ベストアンサー率28% (2/7)
> 製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録 > 可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうす > ればよいでしょうか? この要求を満たすためには、以下のようなテーブル設計をしなければなりません。 hiksonさん、のテーブル構造では、ダメです。 なぜダメなのか分かりますか? SQL文については、一度ご自分で考えてみてください。 ====製品情報テーブル===== 製品ID|スペック|登録日 ~~~~~~ ====製品カテゴリテーブル===== 製品ID|カテゴリID ~~~~~~ ~~~~~~~~~~ ====カテゴリテーブル===== カテゴリID|カテゴリ名| ~~~~~~~~~~ ~~~~~ の項目が主キーです。
- vient
- ベストアンサー率28% (2/7)
この場合ですと、例1の方が良いですよ。 データベースを設計するときは、検索するSQLを考えながら設計すると良いです。 画面イメージや帳票イメージではなく、検索するSQL文をと言うのがポイントです。 例2の例ですと、検索するSQLが複雑になってしまいます。
- msystem
- ベストアンサー率42% (79/186)
データベースの正規化の話になりますが、正規化されているのは「例1」です。 例2をあえて使用するなら、それはパフォーマンスの問題があるときのみです。 例1だと製品のカテゴリ一覧のようなものを取得したくなったときに、「製品テーブル」「このテーブル」×カテゴリの数(この場合5)「カテゴリテーブル」の7つのテーブルの結合が必要になります。 例2だと、「製品テーブル」「このテーブル」「カテゴリテーブル」の3つのテーブルの結合になります。 データベースの操作でテーブルの結合は、非常に負担がかかるものなので、あえて例2の構造をとるのも選択の一つです。 ただ、TICSさんがおっしゃっているとおり、「カテゴリの数が増えない」という大前提があります。DBの設計としては、例1が答えになるとは思います。(cheさんの構造が理論的には、さらに良い回答にはなりますが、さらにパフォーマンスが・・・)
例2に「カテゴリID数」(1~5)を追加して ========== 製品ID|カテゴリID数|カテゴリID-1|カテゴリID-2|カテゴリID-3|カテゴリID-4|カテゴリID-5|スペック| にするか ========== 製品ID|カテゴリID| ========== 製品ID|スペック| の2テーブルにしてID数を入出力側で管理するか それとも、それをあえてくっ付けた例1にするか だと思います。自分なら2番目のが一番楽そうな気が します。あんまし自信なし。
例2だと、カテゴリーIDの入力ミスなどでカテゴリーIDの追加や削除が、何回も起こったときにどうするかが、ややこしくなりそうかなあと思いました。 1のほうが柔軟に対応できるような気がします。
補足
どうもありがとうございます。 例1に絞ってもう一つ質問があります。製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうすればよいでしょうか? ====製品情報テーブル===== 製品ID|カテゴリID|スペック|登録日 ====カテゴリテーブル===== カテゴリID|カテゴリ名|