2012-02-29 63 views
0

對於我的應用程序,我想到了兩種不同的數據模型,但我無法看到哪一個在性能和文件大小上都是最好的。在我的應用程序中,我必須存儲食譜,它將包含一個含有成分的數組,一個帶有說明的數組,一個包含提示和一些屬性的數組以選擇一些食譜(例如評級,菜類型)。關於數據模型的思考

我想到了兩種不同的模型。第一種方法是將數組轉換爲NSData並將它們全部存儲在Core Data模型中。由於數組是本地化的,這意味着在那裏會有多個相同類型的數組(例如instructionsEN,instructionsFR,instructionsNL)。由於不需要查詢數組,我很高興我必須將數組轉換爲NSData。

另一個模型將是一個核心數據,它只包含過濾配方的屬性,以及存儲在主包或文檔目錄中的.plist文件的標識符(因爲其中一些文件將被創建由我們和一些由用戶創建)。這.plist文件將包含所有說明,成分等。同樣,對於不同的本地化,也有多個相同種類的數組。

我希望你能幫助我做出決定,哪些選項在性能和磁盤空間方面最好。如果您能想出不同的解決方案,我也會很感激。

回答

1

如果你打算使用核心數據,你應該一路走下去。在這種情況下,你將擁有一個NSManagedObject成分。我可能會在stringValueForLocale:這樣的配料上加上一種方法,它會照顧到我最好的價值。這意味着給定的成分可以翻譯一次,並且可以重複使用所有食譜。

然後,您將擁有一個Component實體,該實體具有一個成分,一個數量值和一個單位。配方將有一個1:M屬性components指向這些。 Component也應該有一個englishDescription,這將返回一個可打印的值,如「1/4c糖」,而frenchDescription可能會打印出「50g de sucre」(注意那裏的體積/質量轉換;組件可能是您要管理的地方。 )

說明有點不同,因爲它們不太可能被重用。我想你可能會很幸運,並且「把蛋打到硬頂峯。」可能會出現在幾種食譜中,但除非您主動尋找這些重複使用,否則可能比它的價值更麻煩。說明也是解決文化差異的自然場所。在法國,雞蛋通常儲存在室溫下。在美國,他們總是冷藏。要正確翻譯法語菜譜爲美式英語,您有時必須包含一個額外的步驟,例如「將雞蛋帶至室溫」。 (但它取決於配方,因爲它並不總是很重要。)在說明書中而不是在配料中這樣做通常是有意義的。

我可能會創建一個Instructions實體stringValuesForLocale:(這將返回一個字符串數組)。然後,您可以進行一些分析並決定是否將其分解爲單獨的LocalizedInstructions實體,以便您不必錯誤執行所有本地化。這種設計的優點是你可以稍後改變你的內部數據庫佈局,並且不會影響更高的級別。然而,無論如何,我可能會將實際指令存儲爲NSData編碼的NSArray。這可能不值得創建一堆個體LocalizedInstruction實體的麻煩和成本。

+0

所以我應該創建一個食譜實體,它與一個Ingredients實體(它又與Component實體有關係)和一個Instructions實體都有一對多的關係。然後所有這些實體都包含本地化數據的屬性。 – thvanarkel 2012-02-29 20:46:48

+0

這就是我如何攻擊它,至少要開始。如果您需要提高性能或簡化性,它可爲您提供一些重構靈活性。你可以避免爲了找到「高星級食譜」而錯過所有的指示。 – 2012-02-29 21:00:31