Här är några överväganden. I slutändan beror det på dina krav:
-
Betyg är valfritt, eller hur?
Fråga dig i så fall om du vill kombinera en nödvändig funktion (förrådslärare/studentförening) med en trevlig att ha. Kod som implementerar en trevlig-att-ha-funktion skrivs nu till din viktigaste samling. Jag tror att du kan förbättra separeringen av problem i din kod med ett annat db-schema.
-
Behöver du fler funktioner ?
Låt oss säga att du vill ge eleverna en lista över betyg de gav, det genomsnittliga betyg en elev har gett till lärare och att du vill visa en utveckling av betyg över tid. Detta kommer att vara väldigt rörigt med inbäddade dokument. Inbäddade dokument är mindre flexibla .
-
Om du behöver högsta läsprestanda måste du avnormalisera mer data
Om du vill hålla dig till de inbäddade dokumenten kanske du vill kopiera mer data. Låt oss säga att det finns en översikt över betyg per lärare där du kan se elevernas namn. Det skulle vara bra att bädda in ett objekt
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Som alternativ, överväg
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Lärar-/studentföreningen kommer fortfarande att lagras i lärarobjektet, men betygen finns i en annan samling. Ett betyg kan inte skapas om ingen koppling mellan lärare och elev kan hittas.
eller
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
För att hitta alla elever för en viss lärare måste du först fråga länkdokumentet och sedan göra en $in
fråga på eleverna och vice versa. Det är ytterligare en fråga, men den kommer med en enorm vinst i flexibilitet.