核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?

Posted

技术标签:

【中文标题】核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?【英文标题】:Core data: Is there any way to efficiently query a model using implied relationships instead of real ones? 【发布时间】:2012-03-29 15:14:39 【问题描述】:

假设我有以下一种奇怪的核心数据模式:

在这个模型中,有账户和活动,它们共享一个项目的父实体。此外,还有一个关系实体对对象之间的关系进行建模,而不是让核心数据使用“真实”关系对关系进行建模。换句话说,关系实体被用作一种“连接表”。

鉴于此模型,我如何根据相关对象获取对象?例如,我将如何获取具有今天发生的活动的所有帐户?

似乎没有任何方法可以在单个提取请求中执行此操作。到目前为止我能想到的最好的事情是首先获取今天发生的活动,然后是 toId 与这些活动的 id 匹配的关系,最后是 id 与关系中的 fromId 匹配的帐户。

执行此操作的 3 个获取请求是次优的。我们将需要支持数十万的帐户和活动计数,并且执行所有这些获取可能会非常缓慢。在这种模型上使用 NSFetchedResultsController 也很尴尬。

是的,我知道这不是 Core Data 喜欢做事的方式,但是由于涉及我们的服务器架构和跨平台支持的各种原因,我们希望使用这个数据模型和 Core Data,因为它有很多好处提供。提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

AccountActivity 都与Relation 建立关系,即。称为relations,并设置适当的反向关系(称为account/activity)。因此,您的所有项目,包括 AccountActivity 都可以有多个“关系”。

要将帐户链接到活动,请创建一个新的Relation 对象并设置其accountactivity 属性,然后将其添加到帐户和活动的relations 集中。

现在,如果您想获取所有具有活动的帐户,请获取活动的 relations 属性,并针对该集合中的所有项目检索 account 属性。应该可以将其集成到单个查询中。

【讨论】:

以上是关于核心数据:有没有办法使用隐含关系而不是真实关系来有效地查询模型?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据关系可以有多个目的地吗?

为啥我应该使用基于文档的数据库而不是关系数据库?

iOS核心数据一对多关系NSSET

检索关系核心数据中的值

iOS核心数据:存储与不同实体中任何NSManagedObject的关系

机器学习汇总 ----线性回归和正则化