产品目录站点的数据库设计

时间:2011-04-26 10:51:22

标签: database database-design

我正在开发一个由产品和类别组成的电子商务商店。我有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

这有效,但我现在的任务是确保每个可能的组合都在此表中。例如,在添加新产品时,我需要创建所有组合。此外,如果我想在未来添加更多过滤器,表格将变得越来越大。我可以使用另一种方法,或者这是唯一的方法吗?

1 个答案:

答案 0 :(得分: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)