質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

Q&A

解決済

2回答

792閲覧

SQLデータベース設計の改善

sus

総合スコア9

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

データベース設計

データベース設計はデータベースの論理的や物理的な部分を特定する工程です。

0グッド

0クリップ

投稿2020/07/04 05:19

新しくwebサイトを作成するにあたり以下のようなデータベースを考えているのですが、カテゴリーの部分についてお聞きしたいです。
webサイト上で絞り込み検索を実装する時にカテゴリーから複数条件にマッチしたものを取り出したいのですが、以下のようなカテゴリーの1つのフィールドに対して複数の値をコンマ区切りで入れても良いのか、1:1にする場合どのようにテーブルを作成すれば良いのか教えていただきたいです。
またその他で設計に関するご指摘がありましたらお願いします。
黄色で色付けされている部分はプライマリーキーです。イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hihijiji

2020/07/04 09:30

一番上のテーブルが意味不明です。 商品とレビューの紐づけなら商品IDとレビューIDだけで良いです。 画像は商品に紐づくのかレビューに紐づくのかで違ってきます。 カテゴリーは hayato7 さんの回答がベストだと思います。
guest

回答2

0

ベストアンサー

DB設計に関しては、まだまだ疎いという前提でお読みいただければと思います。

カテゴリーと商品の関係が多対多です。検索のことを考えると、多対多のテーブルのまま
行うのは効率がよくないように思います。
一対一の関係にするには中間テーブルを使います。
その場合、以下のようなテーブル構成になります。

  • 商品テーブル

商品ID、商品名

  • カテゴリーテーブル

カテゴリーID、カテゴリー名

  • 商品カテゴリーテーブル

商品ID、カテゴリーID

2020/07/04 追記
即席ですが、以下の画像のようなイメージです。
カテゴリー名が新規に必要であれば、カテゴリーテーブルに追加し、
そのカテゴリーに属する商品IDとカテゴリーIDを商品カテゴリーテーブルに追加するという流れです。
画像は、商品Aのカテゴリーについてのみ商品カテゴリーテーブルにデータを入れています。
イメージ説明

投稿2020/07/04 05:32

編集2020/07/04 10:40
hayato7

総合スコア1135

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sus

2020/07/04 10:24

回答ありがとうございます。 カテゴリーテーブルは商品に複数のカテゴリーがある場合は具体的にどのようにすれば良いのでしょうか?
guest

0

いずれにしても「カテゴリーで検索することがあるかどうか」次第です。
するのであれば、別途商品とカテゴリを紐づけるテーブルが必要でしょう。
teratailのタグと考え方は同じですね。

主に「インデックスがきくかどうか」です。
この手の情報は名称ではなくコードで持たせます。
1つのカラムに入れてしまった場合、likeでの検索になりますし(部分一致はインデックスきかないのが通例)、セパレータも邪魔です。
紐づけテーブルをもっておけばカテゴリコードで完全一致で探せるので、早いです。

カテゴリ名は別途マスタで持っておくことになります。

見たところカテゴリ名が半角英数文字列になっていますが、
これはそのままどこかに表示されるのでしょうか?

もし「日本語名称をマスタで持っている」のなら名前を取得してくる必要がありますね。どのように結合させますか?
「じゃあ日本語名称にしよう」と言うかもしれませんが、名称変更した場合にどのように変更をかけますか?

と言った具合に。

・検索はどのように行われるか
・追加、変更をどのように対応するか

を十分に考えた上で、メンテナンスしやすいように考えると良いでしょう。

もし「定数と同じで、追加も変更もない」のであれば、DBに持つ意味もあまりなさそうに思います。
コードだけ入れておいて表示するときにプログラム側で変換です。

投稿2020/07/04 06:03

m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sus

2020/07/04 06:56

回答ありがとうございます データベース設計に慣れておらずカテゴリー欄は思いついたものになるため妥当ではないです。カテゴリーコードを使用した場合上記写真のhigh,goodなど複数の組み合わせをどのようにカテゴリーコードで表すのか教えていただけるとありがたいです。またこのカテゴリーは追加更新する予定なのでカテゴリーコードもそれに応じて変更できればと思います。検索する際に複数のカテゴリーを選択してそれを含む商品名の結果を表示するようにしたいです(例えばhighとgoodを選択すれば商品Aが表示される)。teratailでいうところの質問投稿を商品のレビュー投稿のようにしたいのですがteratailのタグ機能と同じように実装するには具体的にどのようにすれば良いですか? 質問時の情報が少なく追加で質問する形になりすみません。よろしくお願いします。
m.ts10806

2020/07/04 06:58 編集

あれ、えっとちゃんと書いてます。 >別途商品とカテゴリを紐づけるテーブルが必要でしょう。 >カテゴリ名は別途マスタで持っておくことになります。
m.ts10806

2020/07/04 07:01

>質問時の情報が少なく ひとまず、質問は編集できますので、不足を感じるのでしたら適宜追記してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問