我工作的一個項目具有以下衆多一對多模式:核心數據多到許多關係更新導致故障
書:可以有多個標籤(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