Dr.*_*vil 5 domain-driven-design
很难弄清楚如何对预期的产品行为进行建模。
基本上,客户的库存是按照产品和 skus 进行管理的。
一个产品有多个 sku,但一个 sku 说明多个产品属性。
让我举个例子吧。
假设我要卖给你一件衬衫。“衬衫”是具有某些产品 ID 的产品。如果它有小号、中号、大号,那么这些尺寸中的每一个都将与一个 sku # 相关联。
到目前为止很容易,但是如果衬衫也有多种颜色,比如红色、黄色和绿色,那么将有九个 skus(红色/小号、红色/中号、红色/大号、黄色/小号等等)。
除此之外,还有一个挑战,即不同产品的属性类型可能不同。衬衫可能有尺寸和颜色,手提包可能有不同的提手样式或图案,我不会提前知道,这些都是客户需要能够以临时方式输入的东西。
关于如何从 DDD 的角度解决这个问题的任何想法?我已经在上面烤面条几天了。
谢谢。
首先,你必须将每个 sku 视为单个产品属性,而不是将它们组合起来。如果产品可以有颜色和尺寸,那么它们是两个不同的属性,而不是一个(如红色/小号、红色/中号等)。假设一个产品有 5 个属性,每个属性有 4 个可能的值。然后你就会有4^5=1024sku。这很快就会成为维护的噩梦。
因此,域模型中的前两个对象应该是ProductDefinition和Attribute。ProductDefinition我选择作为名称而不是名称的原因Product是,这只是某些产品类型的标签,例如衬衫。还不是小黄衫。
属性可以有可能的值,因此这形成了第三个域对象:AttributeValue。Attribute和之间的关系AttributeValue是 1:n。一个属性有多个值,一个值只属于一个属性。
请注意,它包含属性的AttributeValue所有可能值,而不是单个产品的实际值。ProductDefinition该实际值成为,Attribute和AttributeValue:之间的关系ProductAttributeValue。数据库模型中的衬衫示例:
ProductDefinition Attribute AttributeValue
1 | Shirt 1 | Color 1 | 1 | Red
2 | Size 2 | 1 | Yellow
3 | 1 | Green
4 | 2 | Small
5 | 2 | Medium
6 | 2 | Large
Run Code Online (Sandbox Code Playgroud)
现在,我们已经对一个产品定义、两个属性以及每个属性的三个属性值进行了建模。假设现在我们要对三件衬衫进行建模:一件红色小件、一件绿色小件和一件黄色大件。这会产生以下ProductAttributeValue内容 ( ProductId, ProductDefinitionId, AttributeId, AttributeValueId):
ProductAttributeValue
1 | 1 | 1 | 1
1 | 1 | 2 | 4
2 | 1 | 1 | 3
2 | 1 | 2 | 4
3 | 1 | 1 | 2
3 | 1 | 2 | 2
Run Code Online (Sandbox Code Playgroud)