我正在建立一个网站的一部分,其中产品可以有各种影响价格的选项。想想床上用品。有尺寸选项,是否需要床头板等等。每个选项都会影响成本。但是,并非所有产品都具有所有选项。
例如,带床头板的 90 厘米床与不带床头板的 120 厘米床的成本不同。
我使用过可能只有一个选项(例如 T 恤尺寸或颜色)的产品选项,但没有像这样的复杂选项。在我的 MySQL 数据库中存储这些选项的最佳方法是什么?
我正在建立一个网站的一部分,其中产品可以有各种影响价格的选项。想想床上用品。有尺寸选项,是否需要床头板等等。每个选项都会影响成本。但是,并非所有产品都具有所有选项。
例如,带床头板的 90 厘米床与不带床头板的 120 厘米床的成本不同。
我使用过可能只有一个选项(例如 T 恤尺寸或颜色)的产品选项,但没有像这样的复杂选项。在我的 MySQL 数据库中存储这些选项的最佳方法是什么?
这是我想到的设计,这是一个没有看到你的架构的假设。希望它能澄清我的评论。如果这与您的要求不同,请告诉我们。乐意效劳。:)
参考
选项表:
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) 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 将具有产品和选项的映射