2

我有一个包含 3 种实体类型的核心数据数据库,即 Unit/Department/Document..

Unit/Department在Department端是一对多的,即一个Unit可以有多个Department,但是每个Department只能有一个Unit。

每个文档都可以是一个或多个单位和/或部门的一部分,我需要能够找到与所选单位或部门匹配的文档。单位 ID 可以是“1234”,该单位的部门 ID 可能是“123499”。请注意,Department id 始终是 Unit 的 4 个数字,然后是描述 Department 的另外 2 个数字。

对于数据模型来说,问题是当我选择一个单元(并且没有部门)并且需要列出该单元下的所有文档时,搜索应该返回属于该单元的所有文档以及该单元的所有文档属于那个单位下的所有部门,搜索需要超过 4 秒,有 5000 个文档,我一定做错了。

我正在使用 NSFetchedResultsController,这是我的谓词。

NSPredicate *predicate;
NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Document"];   
[req setPropertiesToFetch:[NSArray arrayWithObjects:@"name",@"publisher",@"isFavourite", nil]];
 req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]; 
[req setFetchBatchSize:15];
predicate = [NSPredicate predicateWithFormat:@"ANY units.id == %@ || ANY departments.id BEGINSWITH[cd] %@",self.selectedUnit.id,self.selectedUnit.id];

我可以用另一种方式做到这一点吗?我想知道我是否可以选择 Unit ,然后通过 Unit.documents 代替,但是我认为不需要我的 FetchController ,我需要将结果放入一个数组中,然后先对它们进行排序(它会获取所有实体,并且需要更长的时间)..

更糟糕的是,我以后还需要能够在文档的 Name 属性中进行搜索,并且 CONTAINS[cd] 使搜索变得更慢,不幸的是我无法将单词拆分为单独的表,因为我需要能够在单词中匹配单词,也就是说,用户可以输入“结果”,搜索应该返回标题中某处有“结果”的所有文档,例如“NSFetchedResultControllers 很酷”

我怎样才能使 CONTAINS 搜索性能更好,现在我只有 5000 个文档,但它也可能是 20000 或更多。

有什么好的想法,想法吗?我看过很多 WWDC Core Data 视频,在 Apple 开发者网站上阅读 Core Data 性能,我真的认为我的做法是正确的,但也许我的模型全错了,我可以在 SQL 调试中看到,那里在连接表上花费了很多时间,我试图弄清楚如何使 SQL 更干净。

非常感谢/雅各布

4

1 回答 1

0

您的假设是正确的,CONTAINS并且BEGINSWITH正在显着减慢查询速度。我有两个想法给你:

  1. 使用索引(我相信你从 WWDC 视频中知道)。特别是对于您的文本搜索,CONTAINS这应该是一个很大的性能提升。

  2. 使用您提到的特定谓词,我会尝试使用 id 的 number 属性。在您的方案中,您已经方便地按单位订购了 ID。

谓词可能是这样的:

NSNumber *bottom = [NSNumber numberWithInt:[self.selectedUnit.id intValue]*100];
NSNumber *top = [NSNumber numberWithInt:([self.selectedUnit.id intValue]+1)*100];
[NSPredicate predicateWithFormat:
   @"ANY units.id == %@ || ANY (departments.id > %@ AND departments.id < %@)",
   self.selectedUnit.id, bottom, top];
于 2012-06-04T08:17:14.330 回答