2011-04-26 85 views
2

我正在研究一個由產品和類別組成的電子商務商店。我有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的產品。

但是我想要控制設置圖像,頁面標題,meta標籤,顯示順序等每個這些過濾器組合。所以我又增加了一個表格:

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

這是有效的,但我現在的任務是確保每個可能的組合都在這個表格中。例如,在添加新產品時,我需要創建所有組合。此外,如果我希望在未來添加更多過濾器,表格將變得越來越大。是否有另一種方法可以使用,或者這是唯一的方法?

+0

爲什麼你創建了一個products2categories表,而不是產品類別的外鍵? – elvenbyte 2011-04-26 10:55:32

+0

「性別」的單獨表格? – Quassnoi 2011-04-26 10:56:44

+0

@ Quassnoi:我聽說性別類別會有爆炸! – 2011-04-26 10:57:30

回答

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)未能這樣做。