• ベストアンサー

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|スペック|

  • hikson
  • お礼率41% (139/338)

質問者が選んだベストアンサー

  • ベストアンサー
noname#2009
noname#2009
回答No.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)
回答No.5

> 製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録 > 可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうす > ればよいでしょうか? この要求を満たすためには、以下のようなテーブル設計をしなければなりません。 hiksonさん、のテーブル構造では、ダメです。 なぜダメなのか分かりますか? SQL文については、一度ご自分で考えてみてください。 ====製品情報テーブル===== 製品ID|スペック|登録日 ~~~~~~ ====製品カテゴリテーブル===== 製品ID|カテゴリID ~~~~~~ ~~~~~~~~~~ ====カテゴリテーブル===== カテゴリID|カテゴリ名| ~~~~~~~~~~ ~~~~~ の項目が主キーです。

  • vient
  • ベストアンサー率28% (2/7)
回答No.4

この場合ですと、例1の方が良いですよ。 データベースを設計するときは、検索するSQLを考えながら設計すると良いです。 画面イメージや帳票イメージではなく、検索するSQL文をと言うのがポイントです。 例2の例ですと、検索するSQLが複雑になってしまいます。

hikson
質問者

補足

どうもありがとうございます。 例1に絞ってもう一つ質問があります。製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうすればよいでしょうか? ====製品情報テーブル===== 製品ID|カテゴリID|スペック|登録日 ====カテゴリテーブル===== カテゴリID|カテゴリ名|

  • msystem
  • ベストアンサー率42% (79/186)
回答No.3

データベースの正規化の話になりますが、正規化されているのは「例1」です。 例2をあえて使用するなら、それはパフォーマンスの問題があるときのみです。 例1だと製品のカテゴリ一覧のようなものを取得したくなったときに、「製品テーブル」「このテーブル」×カテゴリの数(この場合5)「カテゴリテーブル」の7つのテーブルの結合が必要になります。 例2だと、「製品テーブル」「このテーブル」「カテゴリテーブル」の3つのテーブルの結合になります。 データベースの操作でテーブルの結合は、非常に負担がかかるものなので、あえて例2の構造をとるのも選択の一つです。 ただ、TICSさんがおっしゃっているとおり、「カテゴリの数が増えない」という大前提があります。DBの設計としては、例1が答えになるとは思います。(cheさんの構造が理論的には、さらに良い回答にはなりますが、さらにパフォーマンスが・・・)

noname#2009
noname#2009
回答No.2

例2に「カテゴリID数」(1~5)を追加して ========== 製品ID|カテゴリID数|カテゴリID-1|カテゴリID-2|カテゴリID-3|カテゴリID-4|カテゴリID-5|スペック| にするか ========== 製品ID|カテゴリID| ========== 製品ID|スペック| の2テーブルにしてID数を入出力側で管理するか それとも、それをあえてくっ付けた例1にするか だと思います。自分なら2番目のが一番楽そうな気が します。あんまし自信なし。

noname#5179
noname#5179
回答No.1

例2だと、カテゴリーIDの入力ミスなどでカテゴリーIDの追加や削除が、何回も起こったときにどうするかが、ややこしくなりそうかなあと思いました。 1のほうが柔軟に対応できるような気がします。

関連するQ&A

  • 前方一致プログラムの書き方

    MS-SQLServer7.0を使用してASPと連動したHPを製作しております。 1つの製品情報に複数のバイヤー名(1~5個まで)と 1つのスペックを登録し、このデータベースからバイヤー名の前方一致で製品検索を可能にする場合、aspはどう書けばよいでしょうか?バイヤー情報は別テーブルにあり列を次のようにしたと仮定します。 製品情報====== 製品ID|バイヤーID|仕様| バイヤー情報====== バイヤーID|バイヤー名|

  • 一定時間ごとにDBを更新したい

    日々お世話になっております。 一定時間ごとに、あるサイトから得た情報を自動でデータベースに記録していく、ローカルで動くプログラムを作り、これを別のパソコンで常時実行させ、自宅にあるサーバーへ書き込んでいます。 データベースに書き込んだ情報はWebページで利用しています。 今回、(安価な)レンタルサーバーを利用しようと思いましたが、規約では、”外部からのSQLデータベースへの接続禁止”とあり、これは使えそうにありません。 レンタルサーバー自体に、ローカルで動くプログラムを実行させることもできそうにありません。 こういった場合は、どのように解決すればよいのでしょうか? 安価なレンタルサーバーでは不可能なのでしょうか? 環境は、ASP.NET4.0、SQLServer2008 R2、WindowsServer2008 R2、VB.NETです。 漠然とした質問ですみませんが、ご教授下さい。 カテゴリが適切ではない場合、申し訳ありませんが、適切なカテゴリを教えていただければと思います。 よろしくお願いします。

  • ORACLE と MySQLどちらで開発すべきか悩んでいます。

    DB連動型のサイト(NT+IIS+ASP+MS-SQLServer)を既に構築済みですが、 昨今の「Nimda」ウィルスに関連して、Microsoft製品をやめて Linuxにシステム移行しようかと検討しております。 ASPがLinux+Apacheで動作しないことは分かっておりますので、 PHPに移行しようかと覚悟を決めております。 (できれば、ASPの資産をそのまま活かしたいのですが・・・) (Linux+Apacheで、ASP動かす方法ご存知でしたら、合わせて教えてくださーい^-^;) で、データベースなんですが、現在はMS-SQLServerを使ってますが、 Linuxに移行となれば、ORACLEかMySQLしかないかと思っております。 (PostgreSQLは、selectなどの検索系が遅いと聞いておりますので、却下します。) そこで、LINUX+ORACLEか、LINUX+MySQLのどちらで開発すべきか迷っています。 【私が悩んでいる長所・短所】 ■MySQL  ○基本的にソフトは無料なので、低価格で開発できる。(これが、一番ありがたい!)  ×安定性の面で、不安?が・・・。  ×私は、MySQL初心者なので、既存MS-SQLServerデータの移行・DB構築・DBメンテに不安要素いっぱい! ■オラクル  ○私は、Oracleに精通しており、DB構築・データ移行・DBメンテが容易にできる。  ○安定している。  ×値段が高い。(これが、一番ネックなんです。          だって、100万以上するでしょーToT;予算的に10万くらいが限界・・・。) 費用的なことを考えると、MySQLにしようかという雰囲気です。 どうぞ、ご意見をお聞かせいただければ幸いです。

  • [ASP+SQLserver]列名から列番号を取得できないか?

    こんにちわ。 ASPでDBを扱うWebページを作っています。 次のようなデータベースがあるとします・・・ (0),(1),(2),(3) →列番号 ID,Name,Tel,Email こういう場合、 Response.write ("Tel") とか Response.write (2) とかでその内容が表示できますよね? それを踏まえて・・・。 このデータベースの列名「Tel」がわかっていてその列が何番にあるか、、、この場合「2」であるということが知りたい場合はどのようにすればいいでしょうか? そういうコマンドなどあればうれしいのですが・・・。 お手数をおかけしますが宜しくお願いいたします。

  • 複数のデータベース使用方法

    tora0125と申します。よろしくお願い致します。 データベース:SQLServer2000とSQLServer2005CTP 開発:VisualStadio.NET2003 言語:C# データベースDB_AとDB_Bというものがあり、随時アクセスするデータベースを変更したいと思っております。 cn.ConnectionString = "Data Source=LOCAL" + "; User Id=TEST" + "; Password=TEST" + "; initial catalog=DB_A" + "; persist security info=True;"; 上記のようにコネクションの設定を行っております。主となるデータベースはDB_Aです。 その後、必要となったときにDB_Bにコネクションを変更する方法をどなたかご教授下さい。 拙い文章でわかりずらい箇所があると思いますが、どうぞよろしくお願い致します。 カテゴリー違いでしたら申し訳ございません。

  • 条件付で空白以外のセルをカウント

    下記のようなエクセルシートがあったとします。 メーカーシートの製品登録数のセルにメーカーIDと一致する項目を製品シートのメーカーIDの列から検索し一致した場合カテゴリ1、2、3のセルから空白以外のセルをカウントするにはどうすればよいでしょうか? -------------------------------------------- 製品シート メーカーID|製品カテゴリ1|製品カテゴリ2|製品カテゴリ3 -------------------------------------------- メーカーシート メーカーID|メーカー名|製品登録数

  • データベースで使わなくなった登録IDの整理方法

    製品を使用しなくなった、又は後継品が出た場合、登録したIDを後継品に振り替えて使用する場合、IDはどのように整理したら良いでしょうか。 Excelで製品に含まれている化学物質を各製品、CAS No.ごとに登録してデータ管理しています。 製品ごとに登録IDを振り、Sheet1に製品のIDのデータ、Sheet2に製品に含まれている化学物質を登録しています。IDを入力するとSheet1から製品を抽出し、製品に含まれている化学物質を入力するデータがあります。 考えている方法は ・後継品の製品IDはハイフンをつける  例 ID 1-1 塗料A  製品が2代3代と更新されたらハイフン後の数字が変化する。 ・使わなくなった製品を過去使用の別のIDに振り直す  例 廃盤・使わなくなった登録IDは別の番台区分にする。又はIDの前に何かしらの文字を付け加える。 廃盤・使わなくなった製品のデータも残したまま、IDを整理して管理しやすいようにしたいです。 実際にExcelデータベースをされている方、データベース管理に詳しい方ご教授下さい。よろしくお願い致します。 Excelは2016です。 Access・マクロの知識は皆無です。

  • asp.net Drop Downlist

    お世話になります Drop DownlistでTextBoxに連動させたいのですが 下記データがあるとします ID|送付区分|金額 1 |郵便局 |300 Drop Down1には送付区分を選び postbackさせてTextBox1に金額を自動に挿入させたいのですがどうすればよいですか? 環境visualstudio2005 asp.net xppro web sqlserver2005

  • お勧め 2ベイ NAS RAID1 ケース

    以下のような 2ベイのNAS RAID ケースの購入を検討しています。 MS2000-100JPS, DC-MCNAS1, SA-DK2-NAS, TS-219P+ Turbo NAS, TS-219 P+ (http://www.coneco.net/specList.asp?FREE_WORD=&LOWPRICE=&HIPRICE=&MAKER_NAME=&OP1_ID=7861770&OP2_ID=&OP3_ID=8266607&OP4_ID=8266590&DISPLAY=20&SPEC_ORDER=DEF&x=41&y=11&SPEC=1%2F%3Futm_source%3Dgoogle&ORDER=&CATEGORY1=0120&CATEGORY2=10&CATEGORY3=15&SID=CO&SHOP_ID=&LIST_KIND=0 より) CRNS35NAS、玄人志向は、RAID1でクラッシュとの事なので ラトックシステム、QNAP、NETGEAR がよいかと考えています。 注目点は、”RAID1”、”AFP”、”信頼性”、”なるべく扱いやすい”です。 おすすめはありますか?よろしくお願いします。

  • ASP.NET2.0のLOGINコントロールとORACLEについて

    こんにちは。 ASP.NET2.0(VB2005)のLOGINコントロールを利用して 認証をしたく考えております。 その際にORACLE9iのデータベースに登録されているユーザー マスタのIDとパスワードに一致した場合の時に認証OK とする方法が分かりません。 ご存じの方お見えでしたら教えていただけないでしょうか? 宜しく御願いいたします。