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