我有这样的问题:
我们说我有一个项目,例如CUP。我想卖掉它,但是想让用户选择CUP属性,例如Size,Color,Material。当用户选择尺寸(可能是大),颜色(可能是黑色)和材料(可能是玻璃)时,我需要告诉他,我们在仓库中有20个这样的杯子,每个成本是25美元。现在:我不知道如何将这些组合存储在数据库中。
这是我的超级愚蠢的解决方案:
对于每个组合我都会有一个专栏,然而,添加任何新组合可能也很痛苦,因为删除一些,我将不得不以某种方式映射它们,好吧......
Id |产品名称| LargeBlackGlassPrice | LargeBlackGlassCount | SmallBlackGlassPrice | SmallBlackGlassCount |介质...
愚蠢的想法,但至于现在没有更好的打击:/希望明白我想要实现的目标。 谢谢
答案 0 :(得分:2)
考虑以下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)
让我们尝试解释如何解决您的任务。我将描述一般概念并将其拆分为以下几个步骤:
products
创建表id, name, price
。products_colours
创建表id, name, price
。products_sizes
创建表id, name, price
。products_colours
和{{1 }}。products_sizes
创建表customers_products
。总结:这是非常基本实施,不包括品牌,折扣等内容。但是,它可以让您了解如何在添加影响产品最终价格的其他属性的情况下扩展系统。