在电子商务网站上开始使用领域驱动设计

Dr.*_*vil 5 domain-driven-design

很难弄清楚如何对预期的产品行为进行建模。

基本上,客户的库存是按照产品和 skus 进行管理的。

一个产品有多个 sku,但一个 sku 说明多个产品属性。

让我举个例子吧。

假设我要卖给你一件衬衫。“衬衫”是具有某些产品 ID 的产品。如果它有小号、中号、大号,那么这些尺寸中的每一个都将与一个 sku # 相关联。

到目前为止很容易,但是如果衬衫也有多种颜色,比如红色、黄色和绿色,那么将有九个 skus(红色/小号、红色/中号、红色/大号、黄色/小号等等)。

除此之外,还有一个挑战,即不同产品的属性类型可能不同。衬衫可能有尺寸和颜色,手提包可能有不同的提手样式或图案,我不会提前知道,这些都是客户需要能够以临时方式输入的东西。

关于如何从 DDD 的角度解决这个问题的任何想法?我已经在上面烤面条几天了。

谢谢。

Ron*_*erg 3

首先,你必须将每个 sku 视为单个产品属性,而不是将它们组合起来。如果产品可以有颜色和尺寸,那么它们是两个不同的属性,而不是一个(如红色/小号、红色/中号等)。假设一个产品有 5 个属性,每个属性有 4 个可能的值。然后你就会有4^5=1024sku。这很快就会成为维护的噩梦。

因此,域模型中的前两个对象应该是ProductDefinitionAttributeProductDefinition我选择作为名称而不是名称的原因Product是,这只是某些产品类型的标签,例如衬衫。还不是小黄衫。

属性可以有可能的值,因此这形成了第三个域对象:AttributeValueAttribute和之间的关系AttributeValue是 1:n。一个属性有多个值,一个值只属于一个属性。

请注意,它包含属性的AttributeValue所有可能值,而不是单个产品的实际值。ProductDefinition该实际值成为,AttributeAttributeValue:之间的关系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)