领域模型设计

时间:2009-09-16 04:05:24

标签: domain-driven-design data-modeling

您将如何为此简单示例创建域模型? 配方可以含有许多成分,并且可以在许多配方中使用成分。 每种配方中使用的每种成分中还含有多少。 我设计了以下三个数据库表来存储这些数据和关系。

我现在正在尝试创建一个域模型来表示这一点。我有两个类的基本示例。 当我考虑创造一种新成分时,我遇到了这个模型的麻烦。 需要有一个没有数量属性的类。 该如何建模呢?

数据库表

alt text http://img190.imageshack.us/img190/340/databasex.png

域名模型

alt text http://img24.imageshack.us/img24/8859/classesy.png

4 个答案:

答案 0 :(得分:3)

如果您尝试进行域驱动设计,请不要以表格开头。首先阐述一个反映您的基础领域的概念模型。我同意ndp:从DDD的角度来看,RecipeIngredient有点尴尬的名称/概念。

我认为该模型需要以下概念:配方,成分,测量和配方准备。

食谱是成分的集合。属于配方的每种成分都需要与其相关的量度,作为制剂的规格。此外,您还需要对RecipePreparation进行建模,以关联在配方的特定准备过程中使用的每种成分的实际数量。

措施包括单位和数量(例如2杯,0.5盎司,250克,2汤匙......)。

我在这里看到两种不同的东西可以在分析过程中混合,应该保持分开:配方/成分/措施作为规格,以便做饭(每个食谱一个实例)和RecipePreparation / Ingredient / Measure作为混凝土准备一个食谱,由特定的人在特定的时刻完成,并可能使用不同的措施(所有成分加倍,因为配方规格是两个盘子,你有四个客人......类似的东西)。

你可以更深入地开始建模,比如一些具有一套可交换成分的成分(例如,如果你没有山羊奶酪使用莫扎里拉奶酪),一本收集相同类别的食谱,烹饪时间的食谱食谱等等。

答案 1 :(得分:2)

在您的域模型中,创建一个RecipeIngredient类,其中包含对特定成分和数量的引用。

然后更改Recipe.Ingredients列表以包含RecipeIngredient对象。最后从Ingredient类中删除Quantity。

只是一个提示:大多数纯粹的域模型编制者会说你应该首先创建你的域模型,直到很久以后才关心数据库。

答案 2 :(得分:0)

由于您的联接表(数量)中有数据,答案是您需要一个类来表示它。 (还有其他选择,但不值得考虑。)

随着模型的增长,您无疑需要在此处添加更多数据。例如,如何设置配方中成分的顺序?

从域驱动的设计角度来看,RecipeIngredient有点尴尬的名称(和概念)。你可能会想出更好的感觉。但总的来说,这是一个必要的实现细节。对不起,我没有Evan的DDD书可以提供参考。

答案 3 :(得分:0)

我想你们都迷路了。原始海报有正确的冲动,但走错了路线。实际上,他使用旧的Riehl启发式(结合l和r关系的名称)显示的映射表似乎正在解决它是多对多映射的事实。但真正发生的是你需要一个角色类(Coad的域建模方法使用了很多这些)。这就是事情:那就是成分已经!这里缺少的抽象可以打开一堆蠕虫:它是被添加的东西。有人可能会说这将是一个基类,例如食物(因为我们从字面上看,根据定义不能在食谱中加入不可食用的东西),但是你要承担所有食物的会计负担,或者你可以给它们命名。

所以我认为正确的模型是Recipe包含含有一定量特定食物的成分。