在MySQL中存储变量产品选项

时间:2012-12-05 10:51:34

标签: mysql database-design relational-database

我正在建立一个网站的一部分,产品可以有各种影响价格的选项。想想床上用品有尺寸选择,是否需要床头板,等等。每个选项都会影响成本。但是,并非所有产品都有所有选项。

例如,一张带床头板的90厘米床与120厘米床不同,不会有床头板。

我使用的产品选项可能有一个选项(如T恤尺寸或颜色),但不是这样的复杂选项。在MySQL数据库中存储这些选项的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

这是我想到的设计,它是一个没有看到你的架构的假设。希望它澄清我的评论。如果这与您的要求不同,请告诉我们。乐于帮助。 :)

参考

* SQLFIDDLE

选项表:

ID  NAME              ATTRIBUTE     COST
1   headboard         S             55.5
2   headboard         L             65.2
3   headboard         M             60.3
4   colour_change    (null)         20.3
5   polishing        (null)         70.2

产品表:

ID      NAME      PCOST
1001    chair     50
1002    bed1      1200
1003    table     200
1004    cupboard  2000
1005    bed2      1000

自定义表:

ID  PID     OID     CID
1   1002    3      (null)
2   1002    4      2
3   1003    5      (null)
4   1001    4      1
5   1004    5      (null)

查询1以获取用于每个产品的自定义选项的总和。

select c.pid, sum(o.cost)
from custom c
left join options o
on c.oid = o.id
group by c.pid
;

结果1:

PID     SUM(O.COST)
1001    20.3
1002    80.6
1003    70.2
1004    70.2

查询2:按产品细分选项成本,产品成本

-- prod cost, option cost by options and prod
select x.pid, p.name, p.pcost, x.optCost,
x.optChoices
from prod p
right join (
select c.pid, sum(o.cost) as optCost,
  group_concat(o.name, ' ') optChoices
from custom c
left join options o
on c.oid = o.id
group by c.pid) as x
on x.pid = p.id
;

结果2:

PID     NAME         PCOST  OPTCOST     OPTCHOICES
1001    chair        50     20.3        colour_change
1002    bed1         1200   80.6        headboard ,colour_change
1003    table        200    70.2        polishing
1004    cupboard     2000   70.2        polishing

查询3:最终答案

-- total cost
select x.pid, p.name, x.optChoices,
(p.pcost + x.optCost) totalCost
from prod p
right join (
select c.pid, sum(o.cost) as optCost,
  group_concat(o.name, ' ') optChoices
from custom c
left join options o
on c.oid = o.id
group by c.pid) as x
on x.pid = p.id
;

结果3:

PID     NAME       OPTCHOICES                   TOTALCOST
1001    chair      colour_change                70.3
1002    bed1       headboard ,colour_change     1280.6
1003    table      polishing                    270.2
1004    cupboard   polishing                    2070.2

答案 1 :(得分:0)

您可以创建两个表:

1) Product : id, name, desc, cost

2) Option_master : optionId, option_name, option_unit
3) product_option_mapping : pom_id, optionid, productid

假设您有两种产品选择:

产品表将具有:

id     name           desc        cost
1      Product1   Product1_desc    100

option_master表将具有::

optionId    option_name      option_unit    
1              size                cm     
2             headboard          null

并且product_option_mapping将具有产品和选项

的映射