Domain driven design 在电子商务网站上开始域驱动设计

Domain driven design 在电子商务网站上开始域驱动设计,domain-driven-design,Domain Driven Design,很难弄清楚如何对预期的产品行为建模 基本上,客户的库存是按照产品和SKU进行管理的 一个产品有多个sku,但一个sku代表多个产品属性 让我举个例子 比如说我要卖给你一件衬衫。“衬衫”是带有某种产品ID的产品。如果它有小、中、大三种尺寸,那么每种尺寸都与sku关联 到目前为止很简单,但是如果衬衫也有多种颜色,比如说红色、黄色和绿色,那么将有九个SKU(红色/小、红色/中等、红色/大、黄色/小,等等) 此外,不同产品的属性类型可能不同,这也是一个挑战。衬衫可能有尺寸和颜色,手提包可能有不同的把手样

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

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

一个产品有多个sku,但一个sku代表多个产品属性

让我举个例子

比如说我要卖给你一件衬衫。“衬衫”是带有某种产品ID的产品。如果它有小、中、大三种尺寸,那么每种尺寸都与sku关联

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

此外,不同产品的属性类型可能不同,这也是一个挑战。衬衫可能有尺寸和颜色,手提包可能有不同的把手样式或图案,我不会提前知道,这些都是客户需要能够以特定方式输入的内容

关于如何从DDD的角度来处理这个问题,有什么想法吗?我已经在上面烤面条好几天了


谢谢。

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

因此,域模型中的前两个对象应该是
ProductDefinition
Attribute
。我之所以选择
ProductDefinition
作为名称而不是
Product
,是因为这只是某些产品类型的标签,例如衬衫。它还不是一件小的黄色衬衫

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

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


我们做了一个这样的系统

ProductDefinition has Type (Shirt, Handbag) has many ProductFieldDefinition ProductFieldDefinition has Type (Color, size, pattern) Product has ProductDefinition has SKU has many ProductField has ProductFieldDefinition has Value 产品定义 有款式(衬衫、手提包) 有许多ProductFieldDefinition ProductFieldDefinition 有类型(颜色、大小、图案) 产品 有产品定义 有SKU吗 在这个领域有很多产品 具有ProductFieldDefinition 有价值
在我们的系统中,我要改变的一件事是,我将使用文档数据库来存储所有内容,但在我们的例子中,图形实际上更深入,每个级别都有自己的字段。

罗纳德,我很欣赏答案,但我试图解决的业务问题是,每个属性组合都映射到一个唯一的sku。这就是customer的要求,不是我的,我无法更改。此外,您的答案看起来非常面向数据库,我试图将其作为域对象处理(虽然这是一个次要问题;算法比样式更重要)。我理解,但我不会让客户对sku的定义驱动您的域(数据库)模型。我的模型确实非常面向数据库,但最终你必须存储数据。数据库模型应该以某种方式表示你正在建模的域。sku应该定义为比数据库模型更高的级别,结合我的ProductAttributeValue表中的记录。即ust是一个表示问题。如果您想向客户显示sku,可以使用我描述的模型。但我看不出在您的描述中sku在哪里。它们可以从ProductAttributeValue派生。例如,前两行表示sku为small/red的衬衫。不,它们是用户提供的,不是派生的。 ProductDefinition has Type (Shirt, Handbag) has many ProductFieldDefinition ProductFieldDefinition has Type (Color, size, pattern) Product has ProductDefinition has SKU has many ProductField has ProductFieldDefinition has Value