如何组织具有循环依赖关系的核心数据实体?

时间:2012-11-09 07:01:20

标签: objective-c ios cocoa-touch core-data circular-dependency

这是一个关于如何最好地组织核心数据中NSManagedObjects之间关系的概念性问题。

如果出现循环依赖关系,您如何在Core Data中组织实体?

例如,假设我正在做社交食谱应用。这个应用程序允许您根据谁制作每个食谱和谁购买每种成分来组织膳食。此外,每个食谱都是由不同的人创建的。因此,我提出了以下NSManagedObjects,后面是它们各自的属性和关系:

Chef = uniqueID(字符串),用户名(字符串),技能(字符串)
>> recipesToMake =(to-many)Recipe
>> ingredientsToBuy =(to-many)Ingredient

Recipe = uniqueTitle(String),authorID(String)
>>成分=(对多)Ingredient

Ingredient = name(String),calories(Integer 64)

问题

[_]如果我有多个Chef处理相同的配方,这是否意味着同一Recipe个对象的多个副本存储在Core Data中,每个副本属于一个单独的{{ 1}?如果是这样,那好吗?如果没有,当Chef本身可以指向多个Recipe时,如何在核心数据中创建单个Chef对象并让多个Chef指向它对象通过Recipe

[_]如果给出食谱,我该如何检查分配给哪个recipesToMake?我是否会在核心数据中获取指向具有给定Chef属性的Chef对象的Recipe个对象?

[_]由于uniqueTitle对象可以指向多个Chef个对象,因此将每个Recipe的作者作为属性存储在Recipe上是否正确包含作者的uniqueID?我最初想过要创建一个从Recipe到一个Recipe的关系,但这会在ChefChef个对象之间创建另一个循环依赖关系。

[_]然而,如果Recipe可以通过Chef指向多个Ingredient个对象而ingredientsToBuy可以指向多个Recipe个对象Ingredient,那么在CoreData中会有多个相同ingredients对象的副本吗?

[_]如果我允许Ingredient个对象拥有任意数量的作者,我将如何实现它?使用与Recipe对象的关系似乎会创建循环依赖关系,而使用连接到Chef Chef的属性似乎需要预先指定每uniqueID个作者的最大数量1}}对象。

1 个答案:

答案 0 :(得分:2)

术语“循环依赖”在这里被否定地使用,但你在核心数据中真正指的是关系和反向关系,并且实际上是推荐它。

当您构建一个彼此依赖太多并且在两个方向上相互依赖的类系统时,循环依赖是不需要的,也称为耦合。它们确实不可取,但它更多地涉及代码流和逻辑,而不是处理数据关系时。

以下是您的问题的答案:

  1. 您的责任在于您在代码中强制执行食谱的唯一性,这意味着您必须定义使两个食谱成为“相同”食谱的品质。您甚至可以比较配方的每个成分,或者只需要uniqueTitle就可以比较配方的唯一性。有了它,您可以实现“更新或创建”设计模式,首先通过其主键查找配方,在更简单的方案中,主键是uniqueTitle。如果它已经存在,那么您可以简单地读取和/或更新该对象。否则,将其创建为新的托管对象。对它的后续查询将获取刚刚创建的对象。然后,每个厨师都可以与该单个食谱对象建立关系。

  2. 对于每种关系,定义反向关系也是一种好习惯。在Recipe对象中,将其称为“ChefsMaking”,这可能是指向Chef对象的多对多关系。 (它们结合起来形成“多对多”的关系)。在Xcode中,每个关系都有一个下拉框,您可以在其中设置其反转。

  3. 我确实认为可以创建多个引用相同类型对象的关系。这里有两种类型的关系,从食谱到厨师。一个是“ChefsMaking”,一个多对多的关系。另一个是“作者”,一对一的关系,其中的反向将是Chef对象中的多个“RecipesAuthored”关系。

  4. 答案1中的相同原则适用于此处。定义成分的唯一性,让您的厨师和食谱通过获取已存在的成分(通过其主键)或创建新成分来指向成分。

  5. 只需重新命名您的关系作者,并使其成为多对多关系。

  6. 希望这有帮助!