Cocoa CoreData模型设计:过度使用NSFETCHTREQUEST是否是设计不良模型的症状?
核心数据对象可以通过使用Cocoa CoreData模型设计:过度使用NSFETCHTREQUEST是否是设计不良模型的症状?,cocoa,core-data,data-modeling,Cocoa,Core Data,Data Modeling,核心数据对象可以通过使用NSFetchRequest或遵循与图中其他对象的关系来检索。公平地说,在设计良好的模型中,将包含足够的关系(和获取的属性),从而将NSFetchRequests的使用保持在最低限度,这是否公平 反参数是在iOS中存在NSFetchedRequestController。假设苹果相信关系和获取的属性在现有的故障/缓存中提供了令人满意的性能,那么他们就不会创建NSFetchedRequestController 在某些情况下,使用NSFetchRequest更为优越,因为核
NSFetchRequest
或遵循与图中其他对象的关系来检索。公平地说,在设计良好的模型中,将包含足够的关系(和获取的属性),从而将NSFetchRequests
的使用保持在最低限度,这是否公平
反参数是在iOS中存在NSFetchedRequestController
。假设苹果相信关系和获取的属性在现有的故障/缓存中提供了令人满意的性能,那么他们就不会创建NSFetchedRequestController
在某些情况下,使用NSFetchRequest
更为优越,因为核心数据可以在SQLite中完成所有工作。例如,获取聚合值
有什么想法吗?我已经看了这本书。“获取托管对象”和“核心数据性能”部分提供了相关建议,但没有任何内容强烈建议关系优于获取请求,反之亦然。一般经验法则是,数据模型越简单,获取效果越好,而数据模型越复杂,关系越好
例如,如果您的数据模型有一个没有关系的单一实体,那么抓取最适合查找孤立的托管对象。如果您有一个包含十几个实体的数据模型,所有实体都具有两个或更多关系,那么您将大量使用关系 我要说的是,人际关系和人际关系各有优缺点。作为一名开发人员,您应该知道何时适合使用其中一种。例如,以该模型为例:
-------------- 1 * ------------
| Department |<------------->>| Employee |
-------------- ------------
| name | | name |
-------------- | age |
| salary |
------------
------------1*------------
|部门员工|
-------------- ------------
|姓名| |姓名|
--------------|年龄|
|薪水|
------------
如果要检索属于特定部门的所有员工,则应遵循“department.employees”关系。为谓词为“department==xxxx”的员工实体创建NSFetchRequest是不合适的
相反,如果您希望查找工资>x的特定部门的员工,则可以使用带有谓词“department==xxxxx AND salary>x”的NSFetchRequest。不适合使用department.employees关系检索所有员工,然后在循环中对其进行迭代以查找高收入者
总之,关系或NSFetchRequest本质上不是“好”或“坏”。只要适当地使用它们。使用关系导航对象图。使用NSFetchRequest执行子集搜索,或者在需要灵活地将结果作为字典返回或需要使用nsexpression的地方
编辑以添加:
大量的NSFETCH请求散布在代码中,这是设计糟糕的标志。我总是将数据请求封装在自定义NSManagedObject类中,并尝试在视图/视图控制器代码中不进行任何核心数据调用
我想,获取属性也是实现同样目标的一种方式。我更喜欢在代码中创建NSFetchRequest,而不是使用核心数据编辑器。它更灵活,但两种方式实际上是一样的。在coredata中设计模型时,您应该记住,如果模式中有1、2或n个关系,则表示您的对象图将像SQL数据库一样运行,因为它只获取主行,除了您的应用程序在第一次请求中明确需要所有对象之外。事实上,出于性能原因,苹果公司鼓励在关系中拆分模型,因此,当您的模型在获取时出错时,该时刻将获取其余的。您应该关心的唯一方面是删除规则(null,cascade…),因为设计不好的删除规则可能会崩溃或影响性能。 相信我,我从未见过像核心数据这样高效的东西。创建一个强大的模型,核心数据将完成其余工作 我的一个应用程序(Mariette)使用核心数据,而另一个应用程序(billingfiles)使用SQL有几个想法:(1)NSFetchRequest无法在应用程序启动时缓存数据。(2) Cocoa Touch的NSFetchedResultsController取代了Cocoa的NSArrayController。