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

很难确定如何模拟预期的产品行为.

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

一个产品有很多skus,但一个sku占了几个产品属性.

让我举个例子.

比方说我卖给你一件衬衫. “衬衫”是带有一些产品ID的产品.如果它有小型,中型,大型,则每种尺寸都与sku#相关联.

到目前为止很容易,但如果衬衫也有多种颜色,让我们说红色,黄色和绿色,那么将有9个skus(红色/小号,红色/中号,红色/大号,黄色/小号等等) ).

再加上不同产品的属性类型可能不同的挑战.衬衫可能有尺寸和颜色,手提包可能有不同的手柄样式或图案,我不会提前知道,这些是客户需要能够以一种特殊的方式输入的东西.

有关如何从DDD角度处理此问题的任何想法?我已经把面条烤了几天了.

谢谢.

最佳答案 首先,您必须将每个sku视为单个产品属性,而不是将它们组合在一起.如果产品可以具有颜色和尺寸,则这些是两个不同的属性,而不是一个(如红色/小,红色/中等).假设一个产品有五个属性,每个属性有4个可能的值.然后你会有4 ^ 5 = 1024 skus.这很快就成了维护的噩梦.

因此,域模型中的前两个对象应该是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

我们现在已经为每个属性建模了一个产品定义,两个属性和三个属性值.假设现在我们要模拟三件衬衫:一件小红衬衫,一件小绿衬衫和一件大黄衬衫.这会产生以下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
点赞