在数据库中存储项属性的组合

时间:2016-09-03 20:45:32

标签: mysql database database-design orm combinations

我有这样的问题:

我们说我有一个项目,例如CUP。我想卖掉它,但是想让用户选择CUP属性,例如Size,Color,Material。当用户选择尺寸(可能是大),颜色(可能是黑色)和材料(可能是玻璃)时,我需要告诉他,我们在仓库中有20个这样的杯子,每个成本是25美元。现在:我不知道如何将这些组合存储在数据库中。

这是我的超级愚蠢的解决方案:

对于每个组合我都会有一个专栏,然而,添加任何新组合可能也很痛苦,因为删除一些,我将不得不以某种方式映射它们,好吧......

Id |产品名称| LargeBlackGlassPrice | LargeBlackGlassCount | SmallBlackGlassPrice | SmallBlackGlassCount |介质...

愚蠢的想法,但至于现在没有更好的打击:/

希望明白我想要实现的目标。 谢谢

3 个答案:

答案 0 :(得分:2)

考虑以下ERD:

ERD

系统管理员维护产品类别列表,例如, cups 。管理员还会维护功能列表。这些可能包括尺寸颜色材料,以及他们认为对任何类型的产品都具有潜在重要性的任何其他内容。然后,管理员可以创建类别和功能的交集,以指示哪些功能对特定产品类别至关重要。

这确定了产品目录的“规则”。您拥有哪些类型的产品以及每种产品的重要信息。

现在,要自行存储产品,您需要 SKU 表。每个单独的产品,例如:大型黑色玻璃杯都存储在此表中。您可以在此处存储此产品的当前价格。您也可以在此处存储库存,但我建议elsewhere不要直接存储库存数量。但是,库存管理不是您问题的基础。

对于任何特定产品(SKU),您都有一个产品功能列表,其中存储了每种特定产品的特定值。重要的功能是由CATEGORY_FEATURE表中列出的产品类别定义的功能。

在您的网站上,当客户搜索PRODUCT_CATEGORY中的项目时(例如 Cups ),您会向其显示适用的CATEGORY_FEATURE列表。对于每个功能,您可以使用以下命令创建可供选择的值的下拉列表:

select distinct PF.value
from CATEGORY_FEATURE CF
  inner join PRODUCT_FEATURE PF
    on  CF.product_category_id = PF.product_category_id
    and CF.feature_id = PF.feature_id
where CF.product_category_id = CategoryOfInterest
  and CF.feature_id = FeatureOfInterest
order by
  PF.value

此设计使管理员能够定义新的产品类别和产品功能,而无需进行数据库架构或代码更改。

许多人可能会指出此设计使用实体 - 属性 - 值(EAV)模式,他们同样可能指出 EAV是EVIL 。我原则上同意在几乎所有情况下都要避免使用EAV,但我也断言在某些情况下,特别是在product catalogues的情况下,EAV实际上是首选设计。

答案 1 :(得分:1)

表1 =>杯大师

Fields => Cup Id |产品名称

示例=>

1001 | CUP A

1002 | CUP B

表2 =>物业大师

Fields => Property_Id |特性

示例=>

1 | LargeBlackGlass

2 | SmallBlackGlass

3 | MediumBlackGlass

表3 =>库存大师

Fields => Cup Id | Property_Id |计数| price_per_piece

示例=>

CUP A | 1 | 3 | 45 / =

CUP A | 2 | 2 | 40 / =

CUP A | 3 | 2 | 35 / =

CUP A | 1 | 3 | 45 / =

CUP A | 2 | 2 | 40 / =

注意:可能有一个具有特定属性的杯子,而其他属性可能没有。

答案 2 :(得分:0)

让我们尝试解释如何解决您的任务。我将描述一般概念并将其拆分为以下几个步骤:

  1. 定义您要销售的产品类型:杯子,盘子,平底锅等。使用字段products创建表id, name, price
  2. 定义产品颜色:黑色,红色,棕色。使用字段products_colours创建表id, name, price
  3. 定义产品尺寸:小,中,大。使用字段products_sizes创建表id, name, price
  4. 在简单的情况下,所有类型的产品都具有相同的价格,并将存储在餐桌产品中。
  5. 在简单的情况下,颜色和尺寸的额外价格对于所有类型的产品相同,并将存储在表products_colours和{{1 }}。
  6. 使用字段products_sizes创建表customers_products
  7. 编写一个查询,将所有表连接在一起,从db获取颜色,大小和所有价格的所有产品。
  8. 在脚本中迭代所有行并计算每件商品的价格,作为产品价格,尺寸价格和颜色价格的总和
  9. 总结:这是非常基本实施,不包括品牌,折扣等内容。但是,它可以让您了解如何在添加影响产品最终价格的其他属性的情况下扩展系统。