私の最初の質問は次のとおりです。これらの相互作用はすべて同じコレクションに含める必要がありますか、それとも (RDBMS で行うように) タイプごとに分離する必要がありますか?
リレーショナル データベースに対するドキュメント ストアの最大の利点は、まさにそれができることです。さまざまなインタラクションをすべて 1 つのコレクションにまとめて、さまざまなフィールド セットを用意することを恐れないでください。
さらに、私は検索できるようにしたいと思います:
特定のユーザーが行ったすべてのインタラクション
私は、ユーザーがドキュメントで実行する各対話の対話ドキュメントへの手動参照と、各対話ドキュメントで対話を実行したユーザーへの手動参照を配置することを考えていました。
通常、無期限に大きくなるドキュメントを持つことは良い考えではないことに注意してください。MongoDB には、ドキュメント サイズの上限があります (デフォルト: 16MB)。ドキュメントは完全に RAM キャッシュに読み込まれるため、MongoDB は大きなドキュメントの処理に適していません。大きなオブジェクトが多数ある場合、キャッシュに収まるものはほとんどありません。また、ドキュメントが大きくなると、別のハードドライブの場所に移動する必要がある場合があり、更新が遅くなります (これも自然な順序付けを台無しにしますが、とにかくそれに頼るべきではありません)。
特定のインタラクションを行ったすべてのユーザー
特定のインタラクションインスタンス(複数のユーザーが 1 つのインタラクションの一部であると仮定) を参照していますか、または特定のインタラクションタイプを既に実行したすべてのユーザーを参照していますか?
後者の場合、実行された対話タイプの配列をユーザー ドキュメントに追加します。そうしないと、結合のような操作を実行する必要があり、MapReduce またはアプリケーション側のロジックが必要になるからです。
最初のケースでは、Sammaye の提案に反して、ユーザー コレクションの _id フィールドではなく、ユーザー名を使用することをお勧めします。user.username で unique フラグを使用してインデックスを使用すると、user._id による検索と同じくらい高速で、一意性が保証されます。
その理由は、特定のユーザーによるインタラクションを検索する場合、ID ではなくユーザー名を知っている可能性が高いためです。ユーザー名しかなく、ID でユーザーを参照している場合は、最初にユーザー コレクションを検索して、追加のデータベース クエリであるユーザー名の _id を取得する必要があります。
もちろん、これは常に user._id が手元にあるとは限らないことを前提としています。その場合、もちろん _id を参照として使用できます。