MySQL产品属性表设计

3
为了一个现有的客户项目,我开发了一个CMS来存储产品。产品是具有一些属性(如标题,文本等)的条目。然而,一些客户想要不同的属性,例如价格、颜色等。我试图使我的代码尽可能通用,因此我不想为每个客户修改代码。
我的问题是:如何设计这样一个数据库,使得一个产品可以拥有无限的、多个属性?如何为这样一个不同的设计创建/生成表单?
谢谢阅读。

这是一个常见问题解答,您可以在这里开始并跟随链接 http://stackoverflow.com/questions/6768074/extendable-database-schema-how-to-store-the-extendable-attribute-values/6768919#6768919 - Damir Sudarevic
2个回答

8
您可以为属性和拥有属性的表格分别创建一个表格,因此您的表格模式将如下所示:
产品(id、标题、文本等)
属性(id、名称)
产品属性(ProductId、PropertyId、值)
因此,您可以在属性表格中定义所需属性的列表,并通过在Product_Properties中插入元组将它们分配给产品。假设您有两个产品(A和B),它们具有以下属性:高度、颜色、价格。
A: 180, Red, 200$
B: 170, Blue, 270$

您的表格将包含以下元组:

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

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


属性(id,名称)

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


产品属性(产品编号, 属性编号, 值)

(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'

不错,但是使用这种方法,您将为产品的所有变体设置一个价格。许多企业需要根据不同的属性收取不同的价格,例如大号商品可能比小号商品更昂贵。 - Ozzy

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

请问您能否在回答中提供一些示例数据和几个查询语句?这将非常有帮助,谢谢。 - Herr
@HerrKaleun,这是你需要的。需要更多信息吗? - nobody
1
你的设计存在很多冗余。 - Saeed
我尽力保持简单易懂,以展示概念。它可以进行很多优化。 - nobody

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接