0

次の多対多モデルのプロジェクトに取り組んでいます。

ブック: 複数のタグを持つことができます (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万冊の本を持っていますが、パフォーマンスはあまり良くありません..

tagskvoによって引き起こされるその障害を回避する方法はありますか? O(1)または、インデックス付けによって結果を返すことができる独自の結合テーブルを実装する方法はありますか?

-エルベン

4

1 に答える 1

0

更新が遅れて申し訳ありません。

コア データは、必要なインデックスを作成しないため、多対多の関係には適していません。

最終的に RleationManagedObject を作成しました。これには、BookManagedObject を指すプロパティ「book」と、TagManagedObject を指すプロパティ「tag」があります。両方のプロパティにインデックスが付けられています (非常に重要です。デフォルトのコア データは両方のプロパティにインデックスを付けていません)。

「book_1」に「tag_1」を追加する必要があるたびに、「book_1」と「tag_1」を含むすべての RelationManagedObject を検索します。見つからない場合は、この relationshipManagedObject を作成します。<"book_1", "tag2">、または <"book_2", "tag_1"> などで relationshipManagedObject を作成することもできます。基本的には自分で関係を管理しています。

したがって、落とし穴は、コアデータの多対多の関係が適切にインデックス付けされないことです。

また、xcode は実行した SQL を出力できます。アプリを初めて開いたときに、コア データで定義したテーブルが作成されます。CoreData Framework が適切にインデックスを作成せずにデフォルトの「関係」テーブルを作成する方法を確認できます。それが私が問題を見つけた方法です。

于 2014-02-09T23:16:03.663 に答える