Aqui estão algumas considerações. No final, depende de suas necessidades:
-
A avaliação é opcional, certo?
Em caso afirmativo, pergunte a si mesmo se deseja combinar um recurso obrigatório (armazenamento de associação de professor/aluno) com um interessante. O código que implementa um recurso interessante agora grava em sua coleção mais importante. Acho que você pode melhorar a separação de interesses em seu código com um esquema de banco de dados diferente.
-
Você precisará de mais recursos ?
Digamos que você queira fornecer aos alunos uma lista de notas que eles deram, a nota média que um aluno deu aos professores, e você quer mostrar o desenvolvimento das notas ao longo do tempo. Isso será muito confuso com documentos incorporados. Documentos incorporados são menos flexíveis .
-
Se você precisar de desempenho de leitura superior, precisará desnormalizar mais dados
Se você quiser manter os documentos incorporados, talvez queira copiar mais dados. Digamos que haja uma visão geral das classificações por professor onde você pode ver os nomes dos alunos. Seria útil incorporar um objeto
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Como alternativas, considere
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
A associação professor/aluno ainda será armazenada no objeto professor, mas as classificações estão em coleções diferentes. Uma classificação não pode ser criada se nenhuma associação entre professor e aluno puder ser encontrada.
ou
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Para encontrar todos os alunos de um determinado professor, você precisa primeiro consultar o documento vinculador e, em seguida, fazer um
$in
dúvidas sobre os alunos e vice-versa. Essa é mais uma consulta, mas vem com um enorme ganho em flexibilidade.