0

これは、コア データ内の NSManagedObjects 間の関係を整理する最善の方法に関する概念的な質問です。

循環依存関係があるように見える場合、Core Data 内のエンティティをどのように整理しますか?

たとえば、ソーシャル レシピ アプリを作成しているとします。このアプリでは、誰が各レシピを作っているか、誰が各食材を購入しているかに基づいて食事を整理できます。また、各レシピは別の人物によって作成されています。したがって、次の NSManagedObjects とそれに続くそれぞれの属性と関係を提案します。

Chef
>>= uniqueID (文字列)、ユーザー名 (文字列)、スキル (文字列Recipe
>>)Ingredient

Recipe= uniqueTitle (文字列)、authorID (文字列)
>>成分 = (to-many)Ingredient

Ingredient= 名前 (文字列)、カロリー (整数 64)

質問

[_] 複数Chefの が同じレシピで作業している場合、同じRecipeオブジェクトの複数のコピーが Core Data に保存され、それぞれが別の に属しているということChefですか? もしそうなら、それは大丈夫ですか?そうでない場合、それ自体が を介して多くのオブジェクトを指すことができる場合Recipe、Core Data で単一のオブジェクトを作成し、複数Chefの がそれを指すようにするにはどうすればよいですか?ChefReciperecipesToMake

[_] レシピが与えられた場合、どのChefが割り当てられているかを確認するにはどうすればよいですか? 特定の属性を持つオブジェクトをChef指す Core Data 内のオブジェクトを取得しますか?RecipeuniqueTitle

[_]Chefオブジェクトは多くのオブジェクトを指すことができるので、それぞれの作成者を作成者の uniqueID を含む属性としてRecipe保存するのは正しいですか? 最初はto-oneからリレーションシップを作成することを考えていましたが、そうするととオブジェクトの間にさらに別の循環依存関係が作成されます。RecipeRecipeRecipeChefChefRecipe

[_] もう一度言いますが、を介して多くのオブジェクトを指すことができ、を介して多くのオブジェクトを指すChefことができる場合、CoreDataには同じオブジェクトの複数のコピーが存在するのでしょうか?IngredientingredientsToBuyRecipeIngredientingredientsIngredient

[_]Recipeオブジェクトに任意の数の作成者を許可する場合、どのように実装しますか? オブジェクトとの関係を使用するとChef、循環依存関係が作成されるように見えますが、 に接続された属性を使用すると、オブジェクトChef uniqueIDごとの作成者の最大数を事前に指定する必要があるようですRecipe

4

1 に答える 1

3

ここでは「循環依存」という用語が否定的に使用されていますが、Core Data で実際に言及しているのは関係と逆の関係であり、実際に推奨されています。

相互に過度に依存し、双方向に依存する (カップリングとも呼ばれる) クラスのシステムを設計する場合、循環依存関係は望ましくありません。それらは確かに望ましくありませんが、データ関係を扱う場合ではなく、コード フローとロジックに関連しています。

質問に対する回答は次のとおりです。

  1. コード内でレシピの一意性を強制する責任はユーザーにあります。つまり、2 つのレシピを「同じ」レシピにする品質を定義する必要があります。レシピの各 Ingredient を比較することもできますし、uniqueTitle だけでレシピの一意性を比較することもできます。これにより、「更新または作成」設計パターンを実装できます。最初に主キー (単純なシナリオでは uniqueTitle) でレシピを検索します。すでに存在する場合は、そのオブジェクトを読み取ったり更新したりできます。それ以外の場合は、新しい管理対象オブジェクトとして作成してください。それに対する後続のクエリは、作成されたばかりのオブジェクトをフェッチします。各シェフは、その単一の Recipe オブジェクトと関係を持つことができます。

  2. すべての関係について、逆関係も定義することをお勧めします。Recipe オブジェクトでは、「ChefsMaking」のような名前を付けます。これはおそらく、Chef オブジェクトを指す対多の関係です。(それらを組み合わせて「多対多」の関係を作ります)。Xcode では、逆を設定できる各関係のドロップダウン ボックスがあります。

  3. 同じタイプのオブジェクトを参照する複数の関係を作成できると信じています。ここでは、Recipe から Chef を指す 2 種類の関係があります。1 つは、対多関係である「ChefsMaking」です。もう 1 つは "Author" で、1 対 1 の関係です。この逆は、Chef オブジェクトの対多の "RecipesAuthored" 関係になります。

  4. ここでは、回答 1 と同じ原則が適用されます。Ingredient の一意性を定義し、Chef と Recipes が既存の Ingredient を (主キーで) フェッチするか、新しい Ingredient を作成することでポイントするようにします。

  5. リレーションシップの名前を Authors に変更し、対多リレーションシップにします。

お役に立てれば!

于 2012-11-09T07:30:40.503 に答える