在数据库中获取关系计数的有效方法

Posted

技术标签:

【中文标题】在数据库中获取关系计数的有效方法【英文标题】:Efficient way to get relationship count in database 【发布时间】:2015-09-30 07:34:29 【问题描述】:

我想知道在对多关系中获取相关实体计数的最佳方法是什么。假设我有一个看起来像这样(简化)的数据模型,我想知道每辆公共汽车的乘客人数:

目前我能想到两种选择:

    为巴士实体添加一个名为 passengerCount 的额外属性,该属性将在每次添加/删除乘客时更新。

    每次需要显示乘客人数时,都是通过抓取乘客并显示他们的人数来完成的。

我的两个选项似乎都非常低效,尽管我不知道使用核心数据更新/获取值有多么繁重。例如,想象为每个表格视图单元格执行第 2 次。

我的问题是:最好的方法是什么?可能是 NSManagedObject 类中的方法(我找不到任何方法)或其他更有效的方法?

【问题讨论】:

您可能想要查看NSFetchRequest resultType 属性的NSCountResultType 枚举值。 【参考方案1】:

开头的三句话:

A.当您遇到运行时问题时,您应该关心效率。 “过早的优化是万恶之源。” (唐纳德·克努斯)

B.谁说所有的乘客实体都必须被提取?你会想到这样的事情……

[bus.passengers count]

... 导致乘客被接走。但是 Core Data 支持故障,所以实体可能会被提取到故障中。 (只有一个 id,但没有完整的对象。)

C.当你打开详细模式时,你可以看到 Core Data 做了什么。为此,请传递启动参数

-com.apple.CoreData.SQLDebug 1

你的问题本身:

如果您确实有问题,可以使用-countForFetchRequest:error: 明确要求计数。

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"passenger"];
fetch.predicate = [NSPredicate predicateWithFormat:@"bus == %@", bus];
…
NSUInteger count = [context countForFetchRequest:fetch error:NULL]; // Please pass an NSError instance in real world

在 Safari 中输入。

【讨论】:

【参考方案2】:

XCode 为您的 Core Data 实体 bus 自动生成的 NSManagedObject 类包含一个属性,用于与 Passenger 对象的多对多关系。

您可以将此属性视为实体的“计算属性”(这意味着您不会自己设置属性,但 Core Data 会在您添加或删除关系时自动更新它)。该属性是一个NSSet?(引用相关的Passenger 对象),NSSet 支持.count 方法。 所以你可以使用.count 而不需要特殊的获取请求。

【讨论】:

以上是关于在数据库中获取关系计数的有效方法的主要内容,如果未能解决你的问题,请参考以下文章

获取核心数据中一对多关系的计数

django中列表列表的排名和计数元素

具有特殊限制的核心数据获取关系计数

如何使用实体关系来获取数组的计数差异

查找重复记录计数的有效方法

如何通过读取、递增和更新数据库中的列来有效地保持计数