【问题标题】:Best database design for product with different price for each attributes针对每个属性具有不同价格的产品的最佳数据库设计
【发布时间】:2011-05-15 11:10:19
【问题描述】:

以下问题的最佳数据库设计是什么:

我的产品具有多种属性,例如颜色、尺寸、材料。根据这些属性,我想计算产品的总价格。每个属性都可以持有一个特定的价格。所以产品的价格是其所有属性成本的总和。

【问题讨论】:

  • 没问题,下次多花点时间把你的问题写好,否则别人不会回答。
  • 实际上,这个想法会是这样的:一件衬衫可以有红色、蓝色、绿色。每种颜色都有特定的可用尺寸,每种尺寸可以有不同的价格。因此,红色尺码与蓝色尺码的价格可能不同
  • 好的,如果颜色是“免费的”,那么只需将颜色的价格设置为零并为尺寸设置价格。因此,如果我想买一件衬衫,我选择绿色和“M”号,绿色的价格为 0 美元,而 M 号的价格为 20 美元,所以我最终会以 20 美元购买 M 号的绿色衬衫 :)
  • 如果是属性的总和,除了小黑款(12美元),15美元的小T恤和中号T恤怎么做?

标签: sql database database-design


【解决方案1】:

第一个想法是 3 张桌子

  • 产品(名称、描述等)
  • 属性(颜色、尺寸、材料等)
  • 多对多链接 ProductAttribute(产品密钥、属性密钥、价格)

对每个产品的 ProductAttribute 求和会给出价格

如果您有一组固定且有限的属性,那么这些属性可以是单个产品表中的单独列,并带有一个计算列来将它们相加。但是,我的感觉是每个产品都有可变数量的属性。因此,将其分解为单独的表格。

当然尽量不要误入 EAV 领域... :-)

编辑:问题更新后

在考虑实施之前,我会使用Object Role Modelling 来捕获模型。

事实或尺寸每种颜色极大地改变了设计

【讨论】:

  • +1 用于建模建议。根据我的经验,定价决策从来都不是简单的。无论业务人员建议什么规则,他们总是在以后添加例外......
【解决方案2】:

包含 ID、BASEPRODUCTID、COLORID、SIZEID、MATERIALID、PRICE 列的 PRODUCT 表似乎是明智的。通过这种方式,您可以获得绿色产品 X,但产品 Y 可能无法提供绿色产品。产品 Z 的绿色化成本可能比产品 X 高得多,因此将颜色 + 价格配对很可能没有意义 - 其他属性也是如此。

BASEPRODUCT 将是一个包含产品信息的表格 - 即名称、描述等。

【讨论】:

    【解决方案3】:

    您有一个基本的 PRODUCTS 表。在该表中,您可以获取产品的基本价格。

    您有一个基本 ATTRIBUTES 表。只是可以应用于您的产品的可能属性列表。通常这比简单的列表更复杂,即它通常也与产品类型相关。换言之,并非所有属性都适用于所有产品。所以一些系统也会有一个 PRODUCTTYPE 表和一个 PRODUCTTYPEATTRIBUTES 表。并且某些属性只有在其他属性生效时才适用。请参阅下面的椅子示例。那里可能会变得非常复杂。

    您有一个链接表,其中 PRODUCT 连接到一个或多个 ATTRIBUTES。在该表中保留了属性附加价格。

    产品的成本是其基本价格加上其属性价格的总和。椅子 = 100。皮革 = 75 升级。黄铜钉 = 25 升级。带黄铜钉的皮椅 = 200。但如果您没有升级皮革,就不需要黄铜钉。所以椅子+黄铜钉不是现实世界的选择。一些数据库在其结构中强制执行此类规则。其他人则在前端进行。它可能会变得相当复杂。

    但是这种三表结构允许您为每个产品拥有多个属性。客户可以订购基本产品,或具有与您的 PRODUCTATTRIBUTES 表中的产品相关联的一个或多个属性的基本产品。

    PRODUCTATTRIBUTES 表中 (productid, attributeid) 上的唯一复合索引会阻止用户多次应用属性:椅子 + 皮革 + 皮革 + 黄铜大头钉是不可能的,所以你也阻止了用户从说皮革升级成本为 100 一行,另一行 125 元,对于相同的产品。

    【讨论】:

    • 这是个好主意。但是如果我需要清点属性怎么办,比如颜色“红色”有 S、M、L 每个都有自己的数量。
    【解决方案4】:

    您可以设计ProductMetadata来描述产品信息,例如颜色、锐度等。 PRODUCT 是要销售、销售和售罄的产品。 ProductMetadata 和 Product 之间的关系是, ProductMetadata(one) 产品(很多)

    产品将包含这些字段,

    • 产品ID
    • ProductMetadataID
    • 颜色ID
    • 尺寸ID
    • 材料 ID
    • 价格
    • 状态(销售、待售、售罄等)

    然后你可以根据连接表计算你想要的。

    如果您以后要添加更多字段,您可以添加一个设置字段来存储产品的 XML 描述。

    【讨论】:

      猜你喜欢
      • 2019-05-28
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 2011-02-12
      • 2011-02-26
      • 1970-01-01
      相关资源
      最近更新 更多