Oto kilka uwag. Ostatecznie zależy to od Twoich wymagań:
-
Ocena jest opcjonalna, prawda?
Jeśli tak, zadaj sobie pytanie, czy chcesz połączyć wymaganą funkcję (przechowywanie stowarzyszenia nauczyciela/ucznia) z funkcją, którą warto mieć. Kod, który implementuje funkcję, którą warto mieć, zapisuje teraz do Twojej najważniejszej kolekcji. Myślę, że możesz poprawić oddzielenie problemów w swoim kodzie z innym schematem bazy danych.
-
Czy będziesz potrzebować więcej funkcji ?
Załóżmy, że chcesz udostępnić uczniom listę ocen, które wystawili, średnią ocenę, jaką uczeń wystawił nauczycielom, i chcesz pokazać zmiany ocen w czasie. Będzie to bardzo brudne z osadzonymi dokumentami. Osadzone dokumenty są mniej elastyczne .
-
Jeśli potrzebujesz najwyższej wydajności odczytu, musisz zdenormalizować więcej danych
Jeśli chcesz trzymać się osadzonych dokumentów, możesz skopiować więcej danych. Załóżmy, że istnieje przegląd ocen nauczyciela, w którym można zobaczyć imiona i nazwiska uczniów. Pomocne byłoby osadzenie obiektu
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Jako alternatywy rozważ
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Stowarzyszenie nauczyciel/uczeń będzie nadal przechowywane w obiekcie nauczyciela, ale oceny znajdują się w różnych kolekcjach. Nie można utworzyć oceny, jeśli nie można znaleźć powiązania między nauczycielem a uczniem.
lub
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Aby znaleźć wszystkich uczniów dla danego nauczyciela, musisz najpierw wysłać zapytanie do dokumentu łączącego, a następnie wykonać $in
zapytaj uczniów i odwrotnie. To jeszcze jedno zapytanie, ale ma ogromny wzrost elastyczności.