【问题标题】:Database design for product catalog site产品目录网站的数据库设计
【发布时间】:2011-04-26 10:51:21
【问题描述】:

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

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

【问题讨论】:

  • 为什么要创建 products2categories 表,而不是在 products 中使用类别的外键?
  • gender 的单独表格?
  • @Quassnoi:我听说性别类别会爆炸!
  • @elvenbyte:不确定@op的型号,但产品可能通常属于几个类别。
  • products2categories 这样产品可以属于多个类别,而不仅仅是一个。另外我想我会失去性别类别,只将gender_id存储在产品表中。

标签: database database-design


【解决方案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)

【讨论】:

    最近更新 更多