我工作的一个项目具有以下众多一对多模式:核心数据多到许多关系更新导致故障
书:可以有多个标签(book.tags) 标签:可以包括很多书(tag.books)
我发现当一本书已经在数据库中,我只是简单地想通过做[bookMO addTagsObject:tag]
添加一个标签到那本书,我会在book.tags中出错。使用仪器,我发现核心数据试图做“[NSObject(NSKeyValueObserver(Notification) willChangeValueForKey:withSetMutation:usingObjects]
”。
我还检查了执行的实际sql,我发现: 注释:从数据库中完成的objectID 0x20140b00
的多对一关系错误“标记”。 ,然后返回一个sql查询,它返回包含这本书的所有标签。我发现内部核心数据使用Book和Tag的连接表。该连接表的主键只是book_id and tag_id
的组合。该联合表格没有编入索引。为了获得所有包含书籍的标签,似乎(我不确定)遍历该联合表中的所有行,因此此操作非常昂贵。
我想现在在我的应用程序中发生的事情是,每当我想为书中添加标签时,我都必须在联合表中执行线性扫描。整体复杂度为O(N^2)
,因为每个操作都会在连接表中进行线性扫描。而我现在有10k书,表现也不是很好..
有没有什么办法可以避免那tags
由kvo触发的故障?或者有什么办法可以实现我自己的连接表,它可以通过索引返回结果O(1)
?
-Erben