Ето някои съображения. В крайна сметка зависи от вашите изисквания:
-
Оценката не е задължителна, нали?
Ако е така, запитайте се дали искате да комбинирате необходима функция (съхраняване на учителска/студентска асоциация) с такава, която е хубаво да имате. Кодът, който имплементира функцията, която е хубаво да имаш, сега пише в най-важната ви колекция. Мисля, че можете да подобрите разделянето на проблемите във вашия код с различна db схема.
-
Имате ли нужда от повече функции ?
Да приемем, че искате да предоставите на учениците списък с оценки, които са дали, средната оценка, която ученик е дал на учителите, и искате да покажете развитие на оценките във времето. Това ще бъде много объркващо с вградените документи. Вградените документи са по-малко гъвкави .
-
Ако имате нужда от най-добра производителност при четене, трябва да денормализирате повече данни
Ако искате да се придържате към вградените документи, може да искате да копирате повече данни. Да приемем, че има преглед на оценките за учител, където можете да видите имената на учениците. Би било полезно да вградите обект
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Като алтернативи разгледайте
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Асоциацията на учители/ученици все още ще се съхранява в обекта на учителя, но оценките са в различни колекции. Оценка не може да бъде създадена, ако не може да се намери връзка между учител и ученик.
или
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
За да намерите всички ученици за даден учител, първо трябва да направите заявка в документа за свързване, след което да направите $in
запитване към учениците и обратно. Това е още една заявка, но идва с огромна печалба в гъвкавостта.