Zde jsou některé úvahy. Nakonec záleží na vašich požadavcích:
-
Hodnocení je volitelné, že?
Pokud ano, zeptejte se sami sebe, zda chcete zkombinovat požadovanou funkci (ukládání asociace učitele/studenta) s funkcí, která je příjemná. Kód, který implementuje užitečnou funkci, nyní zapisuje do vaší nejdůležitější sbírky. Myslím, že můžete zlepšit oddělení obav ve svém kódu s jiným schématem db.
-
Budete potřebovat další funkce ?
Řekněme, že chcete studentům poskytnout seznam hodnocení, která dali, průměrné hodnocení, které student udělil učitelům, a chcete ukázat vývoj hodnocení v čase. S vloženými dokumenty to bude velmi chaotické. Vložené dokumenty jsou méně flexibilní .
-
Pokud potřebujete špičkový výkon při čtení, musíte denormalizovat více dat
Pokud se chcete držet vložených dokumentů, možná budete chtít zkopírovat více dat. Řekněme, že existuje přehled hodnocení podle učitele, kde můžete vidět jména studentů. Bylo by užitečné vložit objekt
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Jako alternativy zvažte
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
Sdružení učitel/student bude stále uloženo v objektu učitele, ale hodnocení jsou v jiných kolekcích. Hodnocení nelze vytvořit, pokud nelze najít žádné spojení mezi učitelem a studentem.
nebo
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Chcete-li najít všechny studenty daného učitele, musíte nejprve zadat dotaz na dokument linkeru a poté provést $in
dotaz na studenty a naopak. To je ještě jeden dotaz, ale přináší obrovský nárůst flexibility.