No.1
- 回答日時:
例2だと、カテゴリーIDの入力ミスなどでカテゴリーIDの追加や削除が、何回も起こったときにどうするかが、ややこしくなりそうかなあと思いました。
1のほうが柔軟に対応できるような気がします。
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番目のが一番楽そうな気が
します。あんまし自信なし。
No.3
- 回答日時:
データベースの正規化の話になりますが、正規化されているのは「例1」です。
例2をあえて使用するなら、それはパフォーマンスの問題があるときのみです。
例1だと製品のカテゴリ一覧のようなものを取得したくなったときに、「製品テーブル」「このテーブル」×カテゴリの数(この場合5)「カテゴリテーブル」の7つのテーブルの結合が必要になります。
例2だと、「製品テーブル」「このテーブル」「カテゴリテーブル」の3つのテーブルの結合になります。
データベースの操作でテーブルの結合は、非常に負担がかかるものなので、あえて例2の構造をとるのも選択の一つです。
ただ、TICSさんがおっしゃっているとおり、「カテゴリの数が増えない」という大前提があります。DBの設計としては、例1が答えになるとは思います。(cheさんの構造が理論的には、さらに良い回答にはなりますが、さらにパフォーマンスが・・・)
No.4
- 回答日時:
この場合ですと、例1の方が良いですよ。
データベースを設計するときは、検索するSQLを考えながら設計すると良いです。
画面イメージや帳票イメージではなく、検索するSQL文をと言うのがポイントです。
例2の例ですと、検索するSQLが複雑になってしまいます。
この回答への補足
どうもありがとうございます。
例1に絞ってもう一つ質問があります。製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうすればよいでしょうか?
====製品情報テーブル=====
製品ID|カテゴリID|スペック|登録日
====カテゴリテーブル=====
カテゴリID|カテゴリ名|
No.5
- 回答日時:
> 製品情報テーブルに登録日を加えてカテゴリ名(1製品に対し1~5個まで登録
> 可能)の前方一致で製品検索し、これを登録日順に並べる場合SQL文はどうす
> ればよいでしょうか?
この要求を満たすためには、以下のようなテーブル設計をしなければなりません。
hiksonさん、のテーブル構造では、ダメです。
なぜダメなのか分かりますか?
SQL文については、一度ご自分で考えてみてください。
====製品情報テーブル=====
製品ID|スペック|登録日
~~~~~~
====製品カテゴリテーブル=====
製品ID|カテゴリID
~~~~~~ ~~~~~~~~~~
====カテゴリテーブル=====
カテゴリID|カテゴリ名|
~~~~~~~~~~
~~~~~ の項目が主キーです。
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はパフォーマンスを考えるときに考えて下さい。
どんな簡単な部分でも、悩み始めると止まりませんから。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- Visual Basic(VBA) 【VBA】指定した検索条件に一致したら別シートに転記したい 2 2022/03/23 16:14
- その他(開発・運用・管理) 社内サイトのコンテンツのカテゴリ分けについて教えてください。 いま、社内向けポータルサイトを直そうと 1 2023/04/18 23:08
- その他(データベース) c言語の問題です。これを踏まえてコーディングしたいのでおしえていただきたいです。 3 2023/08/03 09:27
- その他(データベース) accessについて 2 2022/05/31 16:58
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- Excel(エクセル) Excelで在庫表(クエリ、ピボット) 2 2022/04/11 17:11
- Visual Basic(VBA) ExcelからAccessのテーブルに書き込む時に時間がかかる 1 2022/10/14 20:38
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルリンク リンク元を知...
-
男性と2人で飲食店に行きテーブ...
-
面接のときテーブルが正面に。...
-
「テーブルに座って……」という...
-
ACCESSで3ファイルを結合して、...
-
Accessのリンクテーブルマネー...
-
外部キーだけのテーブル(主キ...
-
論理名とコメント構文(?)について
-
特定物と不代替物の違い
-
L2SWはARPテーブルを持っている?
-
UTF8のテーブルをODBCドライバ...
-
飲み会で、座敷orテーブルどち...
-
お金持ちのテーブル
-
1対1のリレーション(主キー同...
-
アクセスのリンクテーブル一覧...
-
オーダーの覚え方について
-
テーブルデータのエクスポート...
-
クエリを教えてください select...
-
会社の飲み会の幹事になり、座...
-
複雑なSQL文について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
L2SWはARPテーブルを持っている?
-
テーブルリンク リンク元を知...
-
会社の飲み会の幹事になり、座...
-
外部キーだけのテーブル(主キ...
-
飲み会で、座敷orテーブルどち...
-
アクセスのリンクテーブル一覧...
-
複数テーブルにわたるCOUNT
-
男性と2人で飲食店に行きテーブ...
-
「テーブルに座って……」という...
-
複雑なSQL文について
-
まるいテーブル 円い 丸い 漢字...
-
お金持ちのテーブル
-
【PHP】SQL文のSUM関数で出力し...
-
論理名とコメント構文(?)について
-
1つのテーブルに同じデータを参...
-
1対1のリレーション(主キー同...
-
MySQLで複数テーブルを作成する
-
テーブルの白く剥がれてるところに
-
オーダーの覚え方について
-
このテーブルで
おすすめ情報