2011-04-26 16 views
2

私は、製品とカテゴリで構成されたeコマースストアに取り組んでいます。私は製品を分類する主な3つの方法を持っています:カテゴリー別、メーカー別、性別。製品カタログサイトのデータベース設計

私は製品などを一覧表示することができ、これらのテーブルを使用して、次の表

products 
- id 
- name 
- manufacturer_id 
- gender_id 

categories 
- id 
- name 
- parent_id 

products2categories 
- id 
- product_id 
- category_id 

manufacturers 
- id 
- name 

gender 
- id 
- name 

を持っていますすべての製品を見つけなさいmanufacturer_id = 1, gender = 1, category= 453

しかし、これらのフィルタの組み合わせごとに画像、ページタイトル、メタタグ、表示順序などを設定することができます。

pages 
- id 
- category_id 
- manufacturer_id 
- gender_id 
- image 
- page_title 
- meta_description 
- display_order 

これは動作しますが、私は今、一つ一つの可能​​な組み合わせは、この表にあることを確認することのタスクを持っている:だから私は、別のテーブルを追加しました。たとえば、新製品を追加する場合は、すべての組み合わせを作成する必要があります。将来的にさらにフィルタを追加したい場合は、テーブルが大きくなります。私が使用できる別の方法がありますか?これが唯一の方法ですか?

+0

なぜ製品のカテゴリの外部キーを使用するのではなく、products2categoriesテーブルを作成しましたか? – elvenbyte

+0

'gender'の別のテーブルですか? – Quassnoi

+0

@ Quassnoi:性別のカテゴリに爆発が起こると聞いています! –

答えて

1

あなたはこのように、「デフォルト」または完全に一致が存在しない場合に選択される「フォールバック」レコードを使用することができます

SELECT p.*, g.* 
FROM products p 
JOIN product2categories pс 
ON  pc.product_id = p.id 
LEFT JOIN 
     pages gcgm 
ON  gcgm.category_id = pc.category_id 
     AND gcgm.gender_id = p.gender_id 
     AND gcgm.manufacturer_id = p.manufacturer_id 
LEFT JOIN 
     pages gcg 
ON  gcg.category_id = pc.category_id 
     AND gcg.gender_id = p.gender_id 
     AND gcg.manufacturer_id IS NULL 
     AND gcgm.id IS NULL 
LEFT JOIN 
     pages gc 
ON  gc.category_id = pc.category_id 
     AND gc.gender_id IS NULL 
     AND gc.manufacturer_id IS NULL 
     AND gcg.id IS NULL 
JOIN pages g 
ON  g.id = COLAESCE(gcgm.id, gcg.id, gc.id) 
WHERE pc.category_id = 453 
     AND p.manufacturer_id = 1 
     AND p.gender = 1 

これは最初の(gender, manufacturer, collection)の完全な組み合わせを選択しようとすると落ちます最初に(collection, gender)に、次に(collection)に戻してください。

関連する問題