1

私は MongoDB を初めて使用するので、これらの質問が単純なものであれば申し訳ありません。

特定のユーザー インタラクションを追跡し、ユーザーとインタラクションに関する情報を MongoDB に入れるアプリケーションを開発しています。ユーザーからさまざまな情報を収集するいくつかのタイプのインタラクションがあります。

私の最初の質問は次のとおりです。これらの相互作用はすべて同じコレクションに含める必要がありますか、それとも (RDBMS で行うように) タイプごとに分離する必要がありますか?

さらに、私は検索できるようにしたいと思います:

  1. 特定のユーザーが行ったすべてのインタラクション
  2. 特定のインタラクションを行ったすべてのユーザー

私は、ユーザーがドキュメントで実行する各対話の対話ドキュメントへの手動参照と、各対話ドキュメントで対話を実行したユーザーへの手動参照を配置することを考えていました。

私の 2 番目の質問は、次のとおりです。このマニュアル参照の「倍増」は理にかなっていますか、それともこれを行うためのより良い方法はありますか?

どんな考えでも大歓迎です。

ありがとうございました!

4

2 に答える 2

1

私の最初の質問は次のとおりです。これらの相互作用はすべて同じコレクションに含める必要がありますか、それとも (RDBMS で行うように) タイプごとに分離する必要がありますか?

データサイズ、書き込み量、読み取り量、クエリのニーズなどについてあまり知らなくても、私は言います。はい、すべてが 1 つのコレクションに含まれています。

それらを分離することが、RDBMSでこれを設計する方法であるかどうかはわかりません。

「マニュアル参照のこの「倍増」は理にかなっていますか、それともこれを行うためのより良い方法はありますか?」

いいえ、それは私にとって健全なデータベース設計にはなりません。

インタラクション コレクション ドキュメントに を追加するuser_idだけで十分に聞こえます。

したがって、すべてのユーザー インタラクションを取得する場合は、インタラクション コレクションでクエリを実行するだけですuser_id

逆に、クエリ領域に適合するすべてのインタラクションをクエリする場合は、それらを取り出してから、ユーザー コレクションuser_idに対して$in句を実行します。

于 2013-01-25T16:06:16.097 に答える
0

私の最初の質問は次のとおりです。これらの相互作用はすべて同じコレクションに含める必要がありますか、それとも (RDBMS で行うように) タイプごとに分離する必要がありますか?

リレーショナル データベースに対するドキュメント ストアの最大の利点は、まさにそれができることです。さまざまなインタラクションをすべて 1 つのコレクションにまとめて、さまざまなフィールド セットを用意することを恐れないでください。

さらに、私は検索できるようにしたいと思います:

特定のユーザーが行ったすべてのインタラクション

私は、ユーザーがドキュメントで実行する各対話の対話ドキュメントへの手動参照と、各対話ドキュメントで対話を実行したユーザーへの手動参照を配置することを考えていました。

通常、無期限に大きくなるドキュメントを持つことは良い考えではないことに注意してください。MongoDB には、ドキュメント サイズの上限があります (デフォルト: 16MB)。ドキュメントは完全に RAM キャッシュに読み込まれるため、MongoDB は大きなドキュメントの処理に適していません。大きなオブジェクトが多数ある場合、キャッシュに収まるものはほとんどありません。また、ドキュメントが大きくなると、別のハードドライブの場所に移動する必要がある場合があり、更新が遅くなります (これも自然な順序付けを台無しにしますが、とにかくそれに頼るべきではありません)。

特定のインタラクションを行ったすべてのユーザー

特定のインタラクションインスタンス(複数のユーザーが 1 つのインタラクションの一部であると仮定) を参照していますか、または特定のインタラクションタイプを既に実行したすべてのユーザーを参照していますか?

後者の場合、実行された対話タイプの配列をユーザー ドキュメントに追加します。そうしないと、結合のような操作を実行する必要があり、MapReduce またはアプリケーション側のロジックが必要になるからです。

最初のケースでは、Sammaye の提案に反して、ユーザー コレクションの _id フィールドではなく、ユーザー名を使用することをお勧めします。user.username で unique フラグを使用してインデックスを使用すると、user._id による検索と同じくらい高速で、一意性が保証されます。

その理由は、特定のユーザーによるインタラクションを検索する場合、ID ではなくユーザー名を知っている可能性が高いためです。ユーザー名しかなく、ID でユーザーを参照している場合は、最初にユーザー コレクションを検索して、追加のデータベース クエリであるユーザー名の _id を取得する必要があります。

もちろん、これは常に user._id が手元にあるとは限らないことを前提としています。その場合、もちろん _id を参照として使用できます。

于 2013-01-25T16:25:59.310 に答える