将数据结构存储在数据库中的最佳方法是什么?

时间:2011-03-09 16:00:58

标签: mysql database database-design

我正在建立一个网上商店,我有一个问题。 我将有直接价格的产品(例如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

在此图中,您可以看到数据库图表,我认为这对于多价格产品是可以的: database diagram

主要问题: 由于这是一个网上商店,人们会把物品放在购物车里。我认为插入购物车的商品应该来自同一张表(在我们的例子中,它是[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智能手机),以便它可以像多价产品一样添加到购物车中。

3 个答案:

答案 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)

嗯,好像你需要两张有一对多关系的桌子 像:(Psudocode)

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

如果产品有一个价格或多个价格,那就无所谓了。