我正在建立一个网上商店,我有一个问题。 我将有直接价格的产品(例如HTC Touch 2智能手机:299.00美元),但同时我会有基于品种组合价格的产品: 例如:
product: Nike Exclusive T-Shirt 2011
varieties:
Sizes: L, XL
Colors: red, blue
combinations will be:
L white - $10
XL white - $15
L blue - $11
XL blue - $16
我需要数据库结构的最佳方式(或唯一的工作:)),我可以存储这两种类型的产品,如果我想在网页上列出包含两种类型产品的类别的产品(单个价格,多个价格)我可以构建一个mysql查询来获取同一查询中的所有产品。
感谢
更新
我肯定会有以下表格:[products]
,[varieties]
(颜色,尺寸),[varietyValues]
(其中包含产品的颜色和尺寸以及尺寸 - 每个表格中的一行{productId + varietyId + value(红色,S,M,绿色,XL等等)})。在这之后,我会有另一个表[combinations]
,[combinations]
和[varietyValues]
之间存在多对多[n-to-m]关系,这将产生一个新表{{1} }}。这个新的n-to-m表的每一行都有一个价格。
现在问题是我无法弄清楚如何在这个数据结构中存储单一价格的产品。
更新2
在此图中,您可以看到数据库图表,我认为这对于多价格产品是可以的:
主要问题:
由于这是一个网上商店,人们会把物品放在购物车里。我认为插入购物车的商品应该来自同一张表(在我们的例子中,它是[combPrices]
表,因为存储了价格。)
以下是这些表的一些数据,为了更清楚:
[combinations]
[products]
productid | productName
1 | Nike T-Shirt
2 | HTC Touch 2 Smartphone
[specifications]
specId | productId | specName
1 | 1 | Size
2 | 1 | Color
[specvalues]
specValueId | specId | svValue
1 | 1 | L
2 | 1 | XL
3 | 2 | white
4 | 2 | blue
5 | 2 | red
(商品放入购物车)
[combinations]
combinationId | price | description
1 | 10 | White L Nike T-Shirt
2 | 15 | White XL Nike T-Shirt
3 | 11 | Blue L Nike T-Shirt
4 | 16 | Blue XL Nike T-Shirt
5 | 18 | Red XL Nike T-Shirt
[combinationParts]
我希望我的图表和数据库填充有意义:)。
所以最后一个问题是我如何存储单一价格的产品(HTC Touch 2智能手机),以便它可以像多价产品一样添加到购物车中。
答案 0 :(得分:3)
您可以轻松地在产品旁边存储价格,并使用这样的查询来获取产品。
SELECT p.productid,
p.productname,
CASE
WHEN cb.combinationid > 0 THEN cb.price
ELSE p.price
END,
cb.combinationid
FROM products p
LEFT JOIN specifications sp
ON sp.productid = p.productid
LEFT JOIN specvalues spv
ON spv.specid = sp.specid
LEFT JOIN combinationparts cbp
ON cbp.specvalueid = spv.specvalueid
LEFT JOIN combinations cb
ON cb.combinationid = cbp.combinationid
WHERE p.productid IN ( 1, 2 )
AND CASE
WHEN cb.combinationid > 0 THEN cb.combinationid IN ( -100, 1, 2 )
ELSE 1 = 1
END
这需要作为输入产品编号和组合。由于组合可能丢失,我已添加-100作为默认值
答案 1 :(得分:2)
为什么不直接在产品表中添加可以为空的价格列?
如果您想通过单个查询轻松访问所有价格,可以使用视图:
create view combPrices as
select ProductID, null as Variety, Price from tbProducts where Price is not null
union
select tbProductDesc.ProductID, tbProductDesc.Variety, tbProductDesc.Price
from tbProducts
inner join tbProductDesc on tbProducts.ProductID = tbProductDesc.ProductID
答案 2 :(得分:1)
Products
ProductID int autoincrement
ProductName text
ProductDesc
ProductDescID int autoincrement
ProductID int foreign_key
ProductDescription text
Price float
所以你可以填写它:
Products
1 'HTC Touch 2'
2 'White Shirt'
3 'Blue Shirt'
4 'Nike Exclusive T-Shirt 2011'
ProductDesc
1 1 'Smartphone' 299.00
2 2 'Large' 10.00
3 2 'XL' 15.00
4 3 'Large' 11.00
5 3 'XL' 16.00
6 4 'L White' 10.00
7 4 'XL White' 15.00
8 4 'L blue' 11.00
9 4 'XL blue' 16.00
如果产品有一个价格或多个价格,那就无所谓了。