N + 1
を回避できます - $inを使用した何百ものリクエストの問題コード>
-クエリ。これを考慮してください:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
これで、 $ in
を使用して投稿のコメントを見つけることができます クエリを実行すると、特定の作成者によるすべてのコメントを簡単に見つけることもできます。
もちろん、コメントを埋め込み配列としてpostに格納し、 $ in
を実行することもできます。 コメントを取得するときにユーザー情報を照会します。そうすれば、ユーザー名を非正規化する必要はなく、何百ものクエリも必要ありません。
ユーザー名を非正規化することを選択した場合、ユーザーが変更されたときにそのユーザーがこれまでに行ったすべてのコメントを更新する必要があります。彼の名前。一方、そのような操作があまり頻繁に行われないのであれば、それは大したことではないはずです。または、要件に応じて、ユーザーがコメントを付けたときに付けた名前を保存する方がよい場合もあります。
埋め込みに関する一般的な問題は、異なるライターが同じオブジェクトに書き込みます
、したがって、アトミック修飾子
を使用する必要があります ( $ push
など )。これは、マッパーで使用するのが難しい場合があり(ただし、mongoalchemyはわかりません)、一般的に柔軟性が低くなります。