Puoi evitare il N+1
-problema di centinaia di richieste utilizzando $in
-interrogazioni. Considera questo:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Ora puoi trovare i commenti ai post con un $in
query e puoi anche trovare facilmente tutti i commenti fatti da un autore specifico.
Naturalmente, puoi anche archiviare i commenti come un array incorporato nel post ed eseguire un $in
interrogare le informazioni sull'utente quando si recuperano i commenti. In questo modo, non è necessario denormalizzare i nomi utente e non sono comunque necessarie centinaia di query.
Se scegli di denormalizzare i nomi utente, dovrai aggiornare tutti i commenti mai fatti da quell'utente quando un utente cambia, ad es. il suo nome. D'altra parte, se tali operazioni non si verificano molto spesso, non dovrebbe essere un grosso problema. O forse è ancora meglio memorizzare il nome che l'utente aveva quando ha fatto il commento, a seconda delle tue esigenze.
Un problema generale con l'incorporamento è che scrittori diversi scriveranno sullo stesso oggetto
, quindi dovrai usare i modificatori atomici
(come $push
). Questo a volte è più difficile da usare con i mappatori (non conosco la mongoalchimia) e generalmente meno flessibile.