核心数据模型设计:过度使用NSFetchRequest是设计不良模型的症状吗?

时间:2011-10-04 16:17:01

标签: cocoa core-data data-modeling

可以使用NSFetchRequest或通过跟随图中其他对象的关系来检索核心数据对象。可以公平地说,在一个设计良好的模型中,它将包含足够的关系(和获取的属性),以便将NSFetchRequests的使用保持在最低限度吗?

反驳论证是在iOS中存在NSFetchedRequestController。据推测,如果Apple认为关系和获取的属性在现有的错误/缓存中提供了令人满意的性能,那么他们就不会创建NSFetchedRequestController

有些情况下使用NSFetchRequest是优越的,因为Core Data可以在SQLite中完成所有工作。一个例子是获取聚合值。

对此有何想法?我看过Core Data Programming Guide。在“获取托管对象”和“核心数据性能”部分中有相关建议,但没有强烈建议关于提取请求的关系,反之亦然。

3 个答案:

答案 0 :(得分:2)

我会说关系和NSFetchRequest各有其优点和缺点。作为开发人员,您应该知道何时适合使用其中一个。例如,采用这个模型:

--------------  1           * ------------
| Department |<------------->>| Employee |
--------------                ------------
| name       |                | name     |
--------------                | age      |
                              | salary   |
                              ------------

如果您想要检索属于特定部门的所有员工,那么遵循“department.employees”关系是合适的。使用谓词'department == xxxx'为Employee实体创建NSFetchRequest是不合适的。

相反,如果您想找到薪水&gt;的特定部门的员工; x然后使用带有谓词的NSFetchRequest是合适的,例如'department == xxxxx AND salary&gt; X'。使用department.employees关系检索所有员工是不合适的,然后在循环中迭代它们以找到高收入者。

总之,关系或NSFetchRequests本质上不是“好”或“坏”。只需适当使用它们。使用关系导航对象图。使用NSFetchRequest执行子集搜索,或者您需要灵活地将结果作为字典返回或需要使用NSExpressions。

编辑添加:

很多NSFetchRequests遍布你的代码 是一个糟糕的设计标志。我总是将数据请求封装在自定义NSManagedObject类中,并尝试不在视图/视图控制器代码中进行任何核心数据调用。

我认为,提取属性是实现同样目标的一种方式。我更喜欢在代码中创建NSFetchRequest而不是使用Core Data编辑器来完成它。它更灵活,但两种方式都是相同的。

答案 1 :(得分:0)

一般的经验法则是,数据模型越简单,抓取工作越好,而数据模型越复杂,关系就越好。

例如,如果您的数据模型只有一个没有关系的实体,那么获取将最有效地找到隔离的托管对象。如果您的数据模型包含十几个具有两个或更多关系的实体,那么您将大量使用关系。

答案 2 :(得分:0)

当你在coredata中设计模型时,你应该记住,如果你在模式中有1,2或n个关系,那就表明你的对象图将像SQL数据库那样表现,因为它只会获取主行,除了你的app在第一次请求中明确需要所有对象。实际上,Apple出于性能原因鼓励将模型分割成各种关系,因此当你的模型在该时刻获取错误时会获取其余部分。您应该关注的唯一方面是删除规则(null,cascade ..),因为设计错误的删除规则可能会崩溃或影响性能。 相信我,我从来没有看到像核心数据那样有效的东西。制作一个强大的模型,核心数据将完成其余的工作。

我的一个应用程序(Mariette)使用核心数据而另一个(计费文件)使用SQL