【问题标题】:What's the best way to store my datastructure in database?将我的数据结构存储在数据库中的最佳方法是什么?
【发布时间】:2011-07-12 00:45:59
【问题描述】:

我正在建立一个在线商店,但我遇到了问题。 我将有直接价格的产品(例如 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 + variantId + value (red, S, M, green, XL, etc...)} 中。在这个之后,我将有另一个表[combinations],在[combinations][varietyValues] 之间具有多对多[n-to-m] 关系,这将产生一个新表[combPrices]。这个新的 n 到 m 表的每一行都有一个价格。

现在的问题是我不知道如何在这个数据结构中存储单价产品。


更新 2

在这张图片中,您可以看到数据库图,我认为这对于多价产品来说是可以的:

主要问题: 由于这是一个网上商店,人们会将商品放入购物车。我认为插入购物车的商品应该来自同一张表(在我们的例子中是[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]

nmid   |   combinationId   |   specValueId
1      |   1               |   1
2      |   1               |   3
3      |   2               |   2
4      |   2               |   3
5      |   3               |   1
1      |   3               |   4
2      |   4               |   2
3      |   4               |   4
4      |   5               |   2
5      |   5               |   5

我希望我的图表和数据库数量确实有意义:)。

所以最后一个问题是如何存储单价产品(HTC Touch 2 智能手机),以便可以像多价产品一样将其添加到购物车。

【问题讨论】:

    标签: mysql database database-design


    【解决方案1】:

    您可以轻松地将价格存储在产品旁边,并使用这样的查询来获取产品。

    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 作为默认值

    【讨论】:

      【解决方案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
      

      【讨论】:

      • 我猜你是说我可以将单价产品的价格存储在 products 表中,没关系,但你能告诉我什么查询可以读取一个类别中的所有产品(以及同时发生的所有变体)?
      【解决方案3】:

      嗯,您似乎需要两个具有一对多关系的表。
      类似于:(伪代码)

      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
      

      那么,一个产品有一个价格还是多个价格都没有关系。

      【讨论】:

      • 更多详情?你需要什么?
      • 看起来相当复杂。我在思考这一切应该如何连接时遇到了一些麻烦。看起来你是围绕存储服装信息设计的,然后决定在此之后进行分支。目前尚不清楚组合中应该存储什么,但有没有办法添加新类型以使其工作?多对多也可以是一对一。为电子产品等添加新类型。如果衬衫只有大蓝色,你会怎么做? HTC Touch 2 不会有太大的不同。
      • 说实话,我认为您的数据库有点标准化。如果其中一个限制条件是您无法更改结构或限制条件,那么您唯一真正的选择就是稍微作弊。 [规格] 插入一种新类型,比如电子产品。 3 | 2 |电子产品。 [specvalues] 插入一行,类似于 6 | 3 |电话。 [组合] 插入 6 | 299 | HTC Touch 2. [组合零件] 6 | 6 | 6. 这样您就不必对您的商店进行任何真正的更改。您将拥有一款尺寸和价格相同的手机。不过,如果你能改变结构,我想你可以让它更友好一点。
      • 在不改变数据库结构的情况下,这对于具有多种价格、IE、内存的电子产品可能很有用。 HTC Touch 2 8GB 199、HTC Touch 2 16GB 299、HTC Touch 2 32GB 399。或其他。我认为以您当前的结构,您需要将手机视为只有一种尺寸和颜色的衬衫,就像您只能获得蓝色大号的耐克衬衫一样。这也将是一种价格单一的产品。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-08
      • 2016-08-09
      • 2016-12-15
      • 2011-08-09
      • 1970-01-01
      • 2011-06-07
      相关资源
      最近更新 更多