sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo se debe modelar la siguiente relación de muchos a muchos en MongoDB?

Aquí hay algunas consideraciones. Al final, depende de tus requisitos:

  1. La calificación es opcional, ¿verdad?

    Si es así, pregúntese si desea combinar una característica requerida (almacenamiento de asociación de maestro/estudiante) con una que es bueno tener. El código que implementa una característica agradable ahora se escribe en su colección más importante. Creo que puedes mejorar la separación de preocupaciones en tu código con un esquema de base de datos diferente.

  2. ¿Necesitará más funciones ?

    Supongamos que desea proporcionar a los estudiantes una lista de las calificaciones que dieron, la calificación promedio que un estudiante le ha dado a los maestros y desea mostrar el desarrollo de las calificaciones a lo largo del tiempo. Esto será muy complicado con documentos incrustados. Los documentos incrustados son menos flexibles .

  3. Si necesita un rendimiento de lectura superior, debe desnormalizar más datos

    Si desea ceñirse a los documentos incrustados, es posible que desee copiar más datos. Digamos que hay una descripción general de las calificaciones por maestro donde puede ver los nombres de los estudiantes. Sería útil incrustar 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/estudiante aún se almacenará en el objeto profesor, pero las calificaciones se encuentran en colecciones diferentes. No se puede crear una calificación si no se encuentra una asociación entre el profesor y el estudiante.

o

TeacherStudentClass {
    StudentId: id
    TeacherId: id
    Class: id
    ClassName: string // (denormalized, just an example)
    Rating: number // (optional)
    Created: DateTime
}

Para encontrar a todos los estudiantes de un maestro determinado, primero debe consultar el documento del enlace y luego hacer un $in consulta a los alumnos y viceversa. Esa es una consulta más, pero viene con una gran ganancia en flexibilidad.