なにかしらの商品を検索するようなシステムを作る場合、皆様は検索パラメータのデータベース構造はどのようにされてますか?またどのように検索してますか?
例えば
DBに商品を登録し、以下のパラメータの”任意の組み合わせ”で絞り込み検索し、ページングで表示する場合を想定した時
・形状(shape)・・・一つの商品に複数の形状を設定できる
・色(color)・・・一つの商品に複数の色を設定できる
・用途(use)・・・一つの商品に複数の用途を設定できる
・キーワード(keyword)
例えば以下のようなURLで検索条件を渡し
www.sample.com/catalog?page=2&shape[]=circle&color[]=red&color[]=white&use[]=use_a&keyword=キーワード1
Laravel5.5で実装し、LengthAwarePaginatorでページングを実現予定。
LengthAwarePaginatorの引数は、ヒットした商品総数・ページ番号・1ページあたりの表示数・該当ページの商品配列の4つが必要
1ページあたりの表示数は説明簡略の為15で固定とする。
該当ページの商品配列は商品クラスを定義しておき、商品クラスのオブジェクト配列を予定
その時のDBの構造で効率的な方法を悩んでいます。
・案1
DB
■商品TABLE
ID, 商品名
ITEM001, 商品1
ITEM002, 商品2
■形状TABLE
商品ID, 形状
ITEM001, circle
ITEM002, triangle
■色TABLE
商品ID, 色
ITEM001, red
ITEM001, white
ITEM002, black
■用途TABLE
商品ID, 用途
ITEM001, use_a
ITEM001, use_b
ITEM002, use_c
■キーワード(TAG)TABLE
商品ID, タグ
ITEM001, キーワード1
ITEM001, キーワード2
ITEM002, キーワード3
1.URLのGETパラメータからshape,color,use,keywordの値を取得して、
順番に該当する商品IDの配列をそれぞれ取得。
2.array_intersectで共通する商品IDの配列($item_idsとする)を作る
3.2で取得した商品ID配列のcount($item_ids)が総数
4.array_chunk($item_ids, 15)で該当ページの商品配列を取得し、その配列をもとに各商品のオブジェクトは最低限の15個作成
で実現はできるが、テーブル構造はわかりやすいが、商品検索の処理が鈍臭い気がする、もっとスマートな方法は無いものか?
・案2
■商品TABLE
ID, 商品名
ITEM001, 商品1
ITEM002, 商品2
■属性TABLE
商品ID, タイプ, 値
ITEM001, 形状, circle
ITEM001, 色, red
ITEM001, 色, white
ITEM001, 用途, use_a
ITEM001, 用途, use_b
ITEM001, キーワード, キーワード1
ITEM001, キーワード, キーワード2
ITEM002, 形状, 商品2
ITEM002, 色, black
ITEM002, 用途, use_c
ITEM002, キーワード, キーワード3
のように検索条件を一つのテーブルにまとめて少し簡略化して
1.URLのGETパラメータからshape,color,use,keywordの値を取得して、
属性DBから一回で商品ID配列($item_ids)を取ってくる
2.array_chunk($item_ids, 15)で該当ページの商品配列を取得、その配列をもとに各商品のオブジェクトは最低限の15個作成
案1よりは検索の処理はスマートになるけどまだあまりスマートな感じがしない。
皆様このような用途の場合どのようなデータベース設計にされてますでしょうか?
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/29 02:25