Możesz uniknąć N+1
- problem setek żądań używających $in
-zapytania. Rozważ to:
Post {
PosterId: ObjectId
Text: string
Comments: [ObjectId, ObjectId, ...] // option 1
}
Comment {
PostId: ObjectId // option 2 (better)
Created: dateTime,
AuthorName: string,
AuthorId: ObjectId,
Text: string
}
Teraz możesz znaleźć komentarze do postów za pomocą $in
zapytanie, a także możesz łatwo znaleźć wszystkie komentarze zgłoszone przez określonego autora.
Oczywiście możesz również przechowywać komentarze jako osadzoną tablicę w poście i wykonać $in
zapytanie o informacje o użytkowniku podczas pobierania komentarzy. W ten sposób nie musisz denormalizować nazw użytkowników i nadal nie potrzebujesz setek zapytań.
Jeśli zdecydujesz się na denormalizację nazw użytkowników, będziesz musiał zaktualizować wszystkie komentarze, które kiedykolwiek zostały przez tego użytkownika wprowadzone, gdy użytkownik zmieni np. jego imię. Z drugiej strony, jeśli takie operacje nie zdarzają się zbyt często, nie powinno to być wielkim problemem. A może nawet lepiej jest zapisać nazwę użytkownika, gdy dodał komentarz, w zależności od Twoich wymagań.
Ogólny problem z osadzaniem polega na tym, że różni autorzy będą pisać do tego samego obiektu
, więc będziesz musiał użyć modyfikatorów atomowych
(np. $push
). Czasami jest to trudniejsze w użyciu z programistami (choć nie znam się na mongoalchemii) i ogólnie mniej elastyczne.