0

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

例如,带床头板的 90 厘米床与不带床头板的 120 厘米床的成本不同。

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

4

2 回答 2

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
于 2012-12-05T12:51:05.600 回答
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 将具有产品和选项的映射

于 2012-12-05T10:54:52.807 回答