顧客が食品を「愛する」多対多の関係をモデル化しようとしています。
私はこれらのリレーションシップを大量 (数百万) 取得することを期待しているので、スケーリングできない 1 つの結合テーブルになってしまうことを望んでいませんでした。
2 つのドキュメント コレクションを作成しました。
Customers
- name etc
- countOfLoves
- loves [ ... ]
と
Foods
- name etc
- countOfLoves
- loves [ ... ]
各ドキュメント内には、関係を表す「愛」のサブドキュメント コレクションと、合計をすばやく取得するためのカウントがあります。
何百万もの行を持つテーブルに対するクエリの代わりに、単一のドキュメントとそれが部分配列を取得できるため、これは適切にスケーリングされると想定していました。しかし、顧客がたくさんの食べ物を好きになり始めたとき (逆に、食べ物が多くの顧客に愛されたとき) に問題が発生します。
新しい食べ物が気に入ったときに顧客ドキュメントを更新するクエリを次に示します。この場合、顧客はすでに 7000 種類の食品を気に入っています。
query: { _id: "354286" }
update: { $push: { loves: { foodID: "354286", location: [ 55.752197, 37.6156 ] } }, $inc: { countOfLoves: 1 } }
nscanned:1 nupdated:1 keyUpdates:0 locks(micros) w:10135199 10137ms
ここで 2 つの質問があります。
a) なぜこれに 10 秒かかるのですか? $push について何かわからないことがありますか?
b) この種の関係をモデル化できる Mongo 用のより優れたスキーマはありますか?
(そして、私は推測します (c) - 最適化しすぎていますか? ラブ結合テーブルを作成するだけで問題ありませんか?)