proyecto - mongodb tutorial español
¿Cómo debe modelarse la siguiente relación de muchos a muchos en MongoDB? (1)
Supongamos que tengo Estudiante y Maestro en una relación de muchos a muchos. Si solo quiero conocer a todos los profesores de un alumno determinado o viceversa, generalmente lo modelaré utilizando Id. De objeto incrustados. Por ejemplo, si el maestro tiene una propiedad studentIds, que es una matriz de ID de objeto del estudiante, entonces esa es información suficiente para hacer todas las consultas que necesita.
Sin embargo, supongamos que un alumno puede darle una calificación a un maestro. ¿Cómo debe encajar esta calificación en el modelo? Por el momento, hago lo siguiente:
- Dentro de la maestra en lugar de almacenar una matriz de estudiantes, almaceno una matriz de objetos json {studentId: ObjectId, rating: String}
- Al hacer la consulta, transformo la matriz de objetos json en una matriz de ID de alumno y extraigo la información completa como de costumbre
- Así que ahora tengo una matriz de objetos estudiantiles y una matriz de objetos json con las calificaciones
- Sin embargo, dado que el operador $ in en MongoDB no conserva el orden, tengo que hacer mi propia clasificación
- En el último paso, con todo en orden puedo combinar objetos estudiantiles con clasificaciones para obtener lo que quiero
Funciona, pero parece algo intrincado, ¿hay alguna forma mejor de hacerlo?
Aquí hay algunas consideraciones. Al final, depende de sus requisitos:
La calificación es opcional, ¿verdad?
Si es así, pregúntese si desea combinar una característica requerida (almacenamiento de la asociación docente / estudiante) con una que sea agradable. El código que implementa una característica agradable de tener ahora se escribe en su colección más importante. Creo que puede mejorar la separación de preocupaciones en su código con un esquema db diferente.
¿Necesitarás más características ?
Supongamos que desea proporcionarles a los estudiantes una lista de calificaciones que dieron, la calificación promedio que un alumno le ha otorgado a los docentes, y desea mostrar un desarrollo de calificaciones a lo largo del tiempo. Esto será muy complicado con los documentos integrados. Los documentos integrados son menos flexibles .
Si necesita un rendimiento de lectura superior, necesita desnormalizar más datos
Si desea atenerse a los documentos integrados, es posible que desee copiar más datos. Supongamos que hay una descripción general de las calificaciones por maestro donde puede ver los nombres de los alumnos. Sería útil insertar un objeto
{ studentId : ObjectId, rating: string, studentName: string, created: dateTime }
Como alternativas, considere
TeacherRating {
StudentId: id
TeacherId: id
Rating: number
Created: DateTime
}
La asociación profesor / alumno todavía se almacenará en el objeto del profesor, pero las clasificaciones se encuentran en colecciones diferentes. No se puede crear una calificación si no se puede encontrar una asociación entre el docente y el alumno.
o
TeacherStudentClass {
StudentId: id
TeacherId: id
Class: id
ClassName: string // (denormalized, just an example)
Rating: number // (optional)
Created: DateTime
}
Para buscar a todos los alumnos de un profesor determinado, primero debe consultar el documento del vinculador, luego hacer una consulta de $in
los alumnos y viceversa. Esa es una consulta más, pero viene con una gran ganancia en flexibilidad.