0

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

当出现循环依赖时,如何在 Core Data 中组织实体?

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

Chef= uniqueID (String), username (String), Skill (String)
>>recipesToMake = (to-many) Recipe
>>ingredientsToBuy = (to-many)Ingredient

Recipe= uniqueTitle (String), authorID (String)
>>成分 = (to-many)Ingredient

Ingredient= 名称(字符串)、卡路里(整数 64)

问题

[_] 如果我有多个Chef's 在同一个配方上工作,这是否意味着同一Recipe对象的多个副本存储在 Core Data 中,每个副本属于一个单独的Chef? 如果是这样,可以吗?如果没有,我如何Recipe在 Core Data 中创建一个对象并让多个Chef' 指向它,而它Chef本身可以通过 ? 指向多个Recipe对象recipesToMake

[_] 如果给定一个食谱,我将如何检查Chef分配给它的 's ?我会在 Core Data 中获取那些Chef指向Recipe具有给定uniqueTitle属性的对象的对象吗?

[_] 由于一个Chef对象可以指向许多Recipe对象,因此将每个对象的作者存储Recipe为包含作者唯一 ID 的属性是否正确Recipe?我最初会考虑创建从Recipeto-one的关系,但这会在和对象Chef之间创建另一个循环依赖关系。ChefRecipe

[_] 再一次,如果Chefcan point to-many Ingredientobjects viaingredientsToBuy并且Recipecan point-many Ingredientobjects via ingredients,那么CoreData中是否会有同一个对象的多个副本Ingredient

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

4

1 回答 1

3

术语“循环依赖”在这里被否定使用,但您在 Core Data 中真正指的是关系和逆关系,实际上是推荐的。

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

以下是您的问题的答案:

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

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

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

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

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

希望这可以帮助!

于 2012-11-09T07:30:40.503 回答