2012-11-09 94 views
0

這是關於如何最好地組織核心數據中的NSManagedObject之間的關係的概念性問題。如何組織具有循環依賴關係的核心數據實體?

當看起來存在循環依賴關係時,如何組織核心數據中的實體?

例如,假設我正在製作社交食譜應用程序。這個應用程序可以讓你根據誰製作每個食譜以及誰在購買每種食材來組織餐食。另外,每個配方由不同的人創建。因而我提出以下NSManagedObjects隨後由它們各自的屬性和關係:

Chef = UNIQUEID(字符串),用戶名(字符串),技能(字符串)
>> recipesToMake =(一對多)Recipe
>> ingredientsToBuy = (一對多)Ingredient

Recipe = uniqueTitle(字符串),AUTHORID(字符串)
>>成分=(一對多)Ingredient

Ingredient =名稱(字符串),卡路里(整數64)

質詢

[_]如果我有多個Chef「s的同樣配方的工作,是否意味着相同的多個副本對象被存儲在覈心數據中,每個都屬於一個獨立的Chef?如果是這樣,那還好嗎?如果不是,我怎樣才能在Core Data中製作一個Recipe對象,並有多個Chef指向它,Chef本身可以通過recipesToMake指向多個Recipe對象?

[_]如果給出配方,我將如何檢查哪個Chef被分配給它? Core Data中的Chef對象是否會指向具有給定的uniqueTitle屬性的Recipe對象?

[_]由於Chef對象可以指向一對多Recipe目的,它是正確的從而向每個Recipe的作者存儲爲在含有作者的UNIQUEID Recipe屬性?我最初會想到創建一個從Recipe到一個Chef的關係,但這會在ChefRecipe對象之間創建另一個循環依賴關係。

[_]再次,如果Chef可以通過ingredientsToBuy指出,許多Ingredient對象和Recipe可以通過ingredients指出,許多Ingredient對象,也很多會出現在CoreData相同Ingredient對象的多個副本?

[_]如果我允許Recipe對象擁有任意數量的作者,我將如何去實現它?使用與Chef對象的關係似乎會創建循環依賴關係,而使用連接到ChefuniqueID的屬性似乎需要預先指定每個Recipe對象的最大作者數。

+1

不錯的問題! 1年前,我試圖做同樣的事情,資源<->項目。並沒有做到,然後我解決了這個項目,而不使用核心數據。後來我重新用Project的重複來解決這個項目。而且我知道這不是一個好的方法。即使我正在等待答案....感謝張貼這個問題:) –

回答

2

這裏使用的術語「循環依賴」是否定的,但是您真正在覈心數據中提到的是關係和反向關係,以及它實際推薦的。

當您構建一個相互依賴過多且在兩個方向上又稱爲耦合的類的系統時,循環依賴是不必要的。它們確實不可取,但它更多地涉及代碼流和邏輯,而不是在處理數據關係時。

以下是問題的答案:

  1. 的責任是你食譜在代碼中強制唯一性,這意味着你必須定義,使兩個配方的「相同」的配方素質。您甚至可以比較配方的每種配料,或者可能只需將uniqueTitle用於比較配方的唯一性即可。這樣,您就可以實現「更新或創建」設計模式,您可以在其中首先通過主鍵查找配方,而在更簡單的場景中則是uniqueTitle。如果它已經存在,那麼你可以簡單地讀取和/或更新該對象。否則,將其創建爲新的託管對象。隨後的查詢將獲取剛剛創建的對象。然後每個廚師可以與該單個食譜對象有關係。

  2. 對於每一種關係,最好定義反比關係。在Recipe對象中,將其稱爲「ChefsMaking」,這可能是指向Chef對象的一對多關係。 (他們結合起來形成「多對多」的關係)。在Xcode中,可以爲每個關係設置一個下拉框,您可以在其中設置其反轉。

  3. 我相信它有可能創建多個引用相同類型對象的關係。這裏有兩種類型的從食譜到廚師的關係。一個是「ChefsMaking」,一對多關係。另一個是「作者」,一對一的關係,其中的倒數是Chef對象中的多對多「RecipesAuthored」關係。

  4. 回答1的相同原則適用於此處。定義成分的獨特性,並讓您的廚師和食譜指向成分,或者通過提取已存在的成分(通過其主鍵)或創建一個成分。

  5. 只需重新命名您的關係作者,並使其成爲一對多的關係。

希望這有助於!

+0

謝謝!我誤解了多對多關係的概念。 –

+0

至於頭去,如果我有一個反向關係,那麼不創建一個循環包含依賴?每個頭文件都必須包含另一個頭文件才能知道關係類? –