对于当前的客户项目,我开发了一个存储产品的CMS。
产品是具有某些特性的条目,例如 title , text &等
但是,有些客户希望拥有不同的属性,例如价格,颜色&等。
我尝试使我的代码尽可能通用,所以我不想修改代码
为每个客户。
我的问题:
如何设计这样的数据库,产品可以拥有无限的多个属性?
如何为这种不同的设计创建/生成表单?
感谢阅读。
答案 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