次の多対多モデルのプロジェクトに取り組んでいます。
ブック: 複数のタグを持つことができます (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)
、各操作が結合テーブルで線形スキャンを実行するためです。そして、私は現在1万冊の本を持っていますが、パフォーマンスはあまり良くありません..
tags
kvoによって引き起こされるその障害を回避する方法はありますか? O(1)
または、インデックス付けによって結果を返すことができる独自の結合テーブルを実装する方法はありますか?
-エルベン