MySQL产品属性表设计

时间:2011-08-02 11:28:58

标签: mysql database-design

对于当前的客户项目,我开发了一个存储产品的CMS。

产品是具有某些特性的条目,例如 title text &等
但是,有些客户希望拥有不同的属性,例如价格颜色&等。

我尝试使我的代码尽可能通用,所以我不想修改代码
为每个客户。

我的问题:
如何设计这样的数据库,产品可以拥有无​​限的多个属性?
如何为这种不同的设计创建/生成表单?

感谢阅读。

2 个答案:

答案 0 :(得分:8)

您可以拥有属性表和拥有属性的表,因此您的表架构将如下所示:

产品( ID 的,标题,文字,...)

属性( ID ,名称)

Product_Properties( ProductId PropertyId ,value)

因此,您可以在属性表上定义所需属性的列表,并通过在Product_Properties中插入元组将它们分配给产品。考虑您有2个产品(A和B),在您的情况下,具有以下属性:高度,颜色,价格如下:

A: 180, Red, 200$
B: 170, Blue, 270$

你的桌子会有这些元组:

产品( ID ,标题,文本):

(1,"A","desc1")
(2,"B","desc2")

<小时/> 性能( ID ,名称)

(1,"height")
(2,"color")
(3,"price")

<小时/> Product_Properties( ProductId PropertyId ,值)

(1,1,"180")
(2,1,"179")
(1,2,"Red")
(2,1,"Blue")
(1,3,"200")
(2,3,"270")

<小时/> <小时/> 这是一个查询产品,其中“价格”等于'200':

SELECT P.title
FROM Product P,Properties Pr,Product_Properties PP
WHERE  P.id=PP.ProductId AND PP.PropertyId=Pr.id AND Pr.name='height' AND PP.value='200'

答案 1 :(得分:4)

你需要有两张桌子:

CREATE TABLE products( product_id INT, product_name VARCHAR, ... );
CREATE TABLE product_properties( product_id INT, property_name VARCHAR, property_value VARCHAR );

第一个表包含每行一个产品及其唯一ID及其常用属性

--------------------------------------------------------
|  id  |      name       |   other common properties...
--------------------------------------------------------
|  1   |      apple      |   ...
|  2   |      bentley    |
|  3   |      ...        |
|  ... |      ...        |

第二个表将每个产品与其非常见属性相关联:

----------------------------------------------------
| id   |    property_name   |    property_value    |
----------------------------------------------------
|  1   |    color           |    red               |
|  1   |    size            |    large             |
|  2   |    wheel count     |    4                 |
|  2   |    top speed       |    200               |
|  2   |    airbags         |    yes               |
|  ... |    ...             |    ...               |

您通过两个查询获得产品信息,首先获得公共属性:

SELECT product_name, ... FROM products WHERE product_id = 2

然后是非共同属性:

SELECT property_name, property_value FROM product_properties WHERE product_id = 2