您将如何为这个简单的示例创建域模型?一个食谱可以有许多成分,一种成分可以用于许多食谱。每个配方中使用的每种成分的多少也被存储。我设计了以下三个数据库表来存储这些数据和关系。
我现在正在尝试创建一个域模型来表示这一点。我有一个包含两个类的基本示例。然后,当我考虑创造一种新成分时,我在这个模型上遇到了麻烦。需要有一个没有数量属性的类。这应该如何建模?
数据库表
替代文字 http://img190.imageshack.us/img190/340/databasex.png
领域模型
您将如何为这个简单的示例创建域模型?一个食谱可以有许多成分,一种成分可以用于许多食谱。每个配方中使用的每种成分的多少也被存储。我设计了以下三个数据库表来存储这些数据和关系。
我现在正在尝试创建一个域模型来表示这一点。我有一个包含两个类的基本示例。然后,当我考虑创造一种新成分时,我在这个模型上遇到了麻烦。需要有一个没有数量属性的类。这应该如何建模?
数据库表
替代文字 http://img190.imageshack.us/img190/340/databasex.png
领域模型
如果您尝试进行领域驱动设计,请不要从表格开始。首先详细说明一个反映您的基础领域的概念模型。我同意 ndp:从 DDD 的角度来看,RecipeIngredient 是一个有点尴尬的名称/概念。
我认为该模型需要以下概念:Recipe, Ingredient, Measure 和 RecipePreparation。
食谱是成分的聚合。属于食谱的每个成分都需要一个与其关联的度量,作为准备的规范。您还需要对 RecipePreparation 进行建模,以关联在特定配方准备期间使用的每种成分的实际数量。
度量由单位和数量组成(例如 2 杯、0.5 盎司、250 克、2 汤匙……)。
我在这里看到两种不同的东西,它们可以在分析过程中混合在一起,应该保持分开:Recipe/Ingredient/Measure 作为一种规范,以便烹饪一些东西(每个食谱一个实例),RecipePreparation/Ingredient/Measure 作为一种具体准备食谱,由特定人在特定时刻完成,并且可能使用不同的措施(将所有成分加倍,因为食谱规格适用于两个盘子,而您有四个客人......类似这样)。
您可以更深入地开始建模,例如某些具有一组可交换成分的成分(例如,如果您没有山羊奶酪,则使用马苏里拉奶酪),收集一组相同类别食谱的食谱,食谱的烹饪时间, ETC。
在您的域模型中创建一个包含对特定成分和数量的引用的 RecipeIngredient 类。
然后更改 Recipe.Ingredients 列表以包含 RecipeIngredient 对象。最后从成分类中删除数量。
只是一个提示:大多数纯粹的领域建模者会说你应该先创建你的领域模型,直到很久以后才关心数据库。
由于您的连接表中有数据(数量),答案是您需要一个类来表示它。(还有其他选择,但不值得考虑。)
随着模型的增长,您无疑需要在此处添加更多数据。例如,您如何设置食谱中成分的顺序?
从领域驱动设计的角度来看,RecipeIngredient 是一个有点尴尬的名称(和概念)。你也许可以想出不同的名字,感觉更好。但总的来说,这是一个必要的实现细节。抱歉,我手头没有 Evan 的 DDD 书来提供参考。
我想你们都迷路了。最初的海报有正确的冲动,但走错了路。实际上,他展示的映射表,使用旧的 Riehl 启发式(结合 l 和 r 关系的名称)似乎解决了它是多对多映射的事实。但真正发生的是你需要一个角色类(Coad 的领域建模方法经常使用这些)。事情是这样的:这就是成分已经是!但是,这里缺少的抽象会打开一罐蠕虫:它是被添加的东西。有人可能会争辩说那将是一个基类,例如 Food(因为我们从字面上看,根据定义不能在食谱中添加不可食用的东西),但是您有责任说明所有食物,或者您可以只命名它们。
So the correct model I think is Recipe contains Ingredients which have some amount of a specific Food.