Database design for product catalog site
I am working on an e-commerce store consisting of products and categories. I have 3 main ways of filtering products: by category, by manufacturer and by gender.
I have the following tables
products
- id
- name
- manufacturer_id
- gender_id
categories
- id
- name
- parent_id
products2categories
- id
- product_id
- category_id
manufacturers
- id
- name
gender
- id
- name
Using these tables I can list products e.g. find all products where manufacturer_id = 1, gender = 1, category= 453.
However I want to have the control of setting images, page titles, meta tags, display order etc for each of these filter combinations. So I have added another table:
pages
- id
- category_id
- manufacturer_id
- gender_id
- image
- page_title
- meta_description
- display_order
This works, but I now have the task of making sure every single possible combination is in this table. For example when adding a new product, I will need to create all the combinations. Also if I want to add more filters in the future, t开发者_如何学编程he table is going to get bigger and bigger. Is there another approach I could use, or is this the only way?
You could use "default" or "fallback" records which would be selected if there is no exact match, like this:
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
This will first try to select the complete combination of (gender, manufacturer, collection) and will fall back first to (collection, gender) then to (collection) on failure to do so.
加载中,请稍侯......
精彩评论