Cree un modelo de datos que utilice una matriz de Referencias para agrupar documentos relacionados de diferentes tipos en una sola colección. El patrón de colección única puede ser especialmente útil para modelar relaciones de muchos a muchos con una sola copia de los datos. Este patrón puede reducir la duplicación de datos en casos donde el costo de la duplicación es un problema.
Las siguientes características definen el Patrón de Colección Única:
Almacena todos los documentos a los que se accede con frecuencia juntos en una sola colección.
Almacena relaciones entre documentos como punteros o estructuras dentro de cada documento.
Mapea las relaciones entre documentos mediante índices en el campo o matriz. Este índice permite recuperar documentos relacionados en una sola consulta sin necesidad de operaciones de unión de bases de datos.
Considere usar el Patrón de Colección Única al modelar sistemas con operaciones de alta velocidad, requisitos de baja latencia y operaciones de escritura frecuentes. Al dividir el documento en partes más pequeñas, en lugar de grandes documentos incrustados, la base de datos puede realizar operaciones de escritura más pequeñas y mejorar el rendimiento.
Acerca de esta tarea
En el siguiente ejemplo, una aplicación permite a los estudiantes ver el estado de las clases en las que se inscriben durante el semestre. Es posible que el sistema deba actualizar con frecuencia varios campos para cada clase, como el current_topic, upcoming_session_summary o next_class_time. Para evitar la duplicación de información para varios estudiantes que cursan la misma clase, queremos mantener a los estudiantes y las clases como entidades documentales independientes en la misma colección.
Ejemplo
Considere los siguientes esquemas de ejemplo para una clase y un estudiante. Para modelar su relación, los documentos de clase y estudiante contienen la matriz links. Esta matriz incluye los campos doc_type y target para referenciar la relación entre las entidades de clase y estudiante.
Documento de clase:
{ _id : "CS101-001", doc_type : "class", class_name : "Introduction to Programming", course_id : "CS101", instructor : { name : "Dr. Emily Smith", email : "emily.smith@example.com", office_hours : "Tuesdays and Thursdays 2:00 PM - 4:00 PM" }, semester : "Spring 2025", schedule : [ { day_time : "Monday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" }, { day_time : "Wednesday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" }, { day_time : "Friday 10:00 AM - 11:30 AM", location : "Room 101, Science Building" } ], current_topic : "Loops and Iterations", next_class_time : "2025-01-09T10:00:00Z", upcoming_session_summary : "We will explore different types of loops (for, while) and how to use them effectively in Python.", links : [ { target : "CS101-001", doc_type : "class" }, { target : "S10023", doc_type : "student" }, { target : "S12345", doc_type : "student" }, ... { target : "S12355", doc_type : "student" } ] }
Documento del estudiante:
{ _id : "S12345", doc_type : "student", name : "Jane Doe", major : "Computer Science", semester : "Spring 2025", registered_classes : [ { course_id : "CS101", class_instance_id : "CS101-001", class_name : "Introduction to Programming" }, { course_id : "MATH201", class_instance_id : "MATH201-002", class_name : "Calculus II" } ], links : [ { target : "CS101-001", doc_type : "class" }, { target : "MATH201-002", doc_type : "class" }, { target : "S12345", doc_type : "student" } ] }
Para optimizar las consultas, indexe el campo links:
db.students_classes.createIndex({ "links.target": 1, "links.doc_type": 1 })
Se puede query la información de un estudiante y todas las clases que toma sin tener que realizar ninguna operación de unión:
db.students_classes.find({ "links.target": "S12345" })
De manera similar, puedes consultar todos los estudiantes registrados en una clase determinada:
db.students_classes.find({ "doc_type": "student", "links.target": "CS101-001" })