在电子商务网站上开始使用Domain Driven Design

时间:2010-07-03 23:34:29

标签: domain-driven-design

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

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

产品有很多skus,但是一个sku会占用几个产品属性。<​​/ p>

让我举个例子。

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

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

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

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

感谢。

2 个答案:

答案 0 :(得分:2)

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

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

属性可以有可能的值,因此这会产生第三个域对象:AttributeValueAttributeAttributeValue之间的关系为1:n。属性具有多个值,值仅属于一个属性。

请注意,AttributeValue包含属性的所有可能的值,而不是单个产品的实际值。此实际值成为ProductDefinitionAttributeAttributeValueProductAttributeValue之间的关系。在数据库模型中查找衬衫示例:

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内容(ProductIdProductDefinitionIdAttributeIdAttributeValueId):

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

答案 1 :(得分:0)

我们做了这样的系统..

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

我将在系统中更改的一件事是我会使用文档数据库存储所有内容,但在我们的情况下,图表实际上更深入,每个级别都有自己的字段。