针对每种属性的不同价格的产品的最佳数据库设计

时间:2011-05-15 11:10:19

标签: sql database database-design

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

我的产品有几个属性,如颜色,大小,材质。根据这些属性,我想计算产品的总价。每个属性都可以包含特定价格。因此,产品的价格是其所有属性成本的总和。

4 个答案:

答案 0 :(得分:9)

第一个想法是3个表

  • 产品(名称,描述等)
  • 属性(颜色,大小,材质等)
  • 许多链接ProductAttribute(productkey,attributekey,price)

每个产品的ProductAttribute上的SUM将给出价格

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

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

编辑:问题更新后

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

事实或大小每种颜色会大大改变设计

答案 1 :(得分:2)

包含ID,BASEPRODUCTID,COLORID,SIZEID,MATERIALID,PRICE列的PRODUCT表似乎合情合理。这样你可以得到绿色产品X,但也许产品Y不是绿色的。产品Z可能比产品X的成本要高得多,因此配对颜色+价格最有可能没有意义 - 与其他属性相同。

BASEPRODUCT将是一个表格,其中包含产品的正确信息 - 即名称,描述等。

答案 2 :(得分:1)

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

您有一个基本的ATTRIBUTES表。只是可以应用于您的产品的可能属性列表。通常这比简单列表更复杂,即它通常也是产品类型的关键。换句话说,并非所有属性都适用于所有产品。因此,某些系统还具有PRODUCTTYPE表和PRODUCTTYPEATTRIBUTES表。并且只有在其他属性生效时,某些属性才适用。见下面的主席示例。在那里它会变得非常复杂。

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

产品成本是其基本价格加上其属性价格的总和。椅子= 100.皮革= 75升级。黄铜大头钉= 25升级。皮革椅子有黄铜钉= 200.但如果你没有皮革升级你就不需要黄铜钉。因此,椅子+黄铜钉不是真正的选择。一些数据库在其结构中强制执行此类规则。其他人在前端做到这一点。它会变得非常复杂。

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

PRODUCTATTRIBES表中的唯一复合索引(productid,attributeid)会阻止用户多次应用属性:椅子+皮革+皮革+黄铜钉不可能,因此您也阻止了用户从说同一产品的皮革升级成本为100,对另一行成本为125.

答案 3 :(得分:0)

您可以将ProductMetadata设计为描述产品信息,例如颜色,锐利等。 PRODUCT是销售,销售和售罄的产品。 ProductMetadata和Product之间的关系是, ProductMetadata(one)< --->产品(很多)

产品将包含这些字段,

  • 的ProductID
  • ProductMetadataID
  • ColorID
  • SizeID
  • MaterialID
  • 价格
  • 状态(Saling,待售,售罄等)

然后你可以根据联接表计算你想要的东西。

如果您将来再添加一些字段,可以添加一个设置字段来存储产品的XML描述。