2012-02-29 65 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