Můžete se vyhnout N+1
-problém stovek požadavků pomocí $in
-dotazy. Zvažte toto:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Nyní můžete najít komentáře k příspěvkům s $in
dotaz a také můžete snadno najít všechny komentáře konkrétního autora.
Samozřejmě můžete také uložit komentáře jako vložené pole v příspěvku a provést $in
při načítání komentářů se dotazujte na informace o uživateli. Tímto způsobem nemusíte denormalizovat uživatelská jména a přesto nepotřebujete stovky dotazů.
Pokud se rozhodnete denormalizovat uživatelská jména, budete muset aktualizovat všechny komentáře, které kdy daný uživatel učinil, když uživatel změní, např. jeho jméno. Na druhou stranu, pokud k takovým operacím nedochází příliš často, neměl by to být velký problém. Nebo je možná ještě lepší uložit jméno, které měl uživatel při vytváření komentáře, v závislosti na vašich požadavcích.
Obecný problém s vkládáním je, že různé zapisovače budou zapisovat do stejného objektu
, takže budete muset použít atomové modifikátory
(například $push
). To je někdy těžší použít s mappery (neznám však mongoalchemii) a obecně méně flexibilní.