Cree un modelo de datos que utilice un arreglo de referencias para agrupar documentos relacionados de distintos 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 de uso donde el costo de la duplicación sea motivo de preocupación.
Las siguientes características definen el Single colección patrón:
Almacena todos los documentos de acceso frecuente juntos en una sola colección.
Almacena las relaciones entre documentos como punteros o estructuras dentro de cada documento.
Mapea las relaciones entre documentos mediante índices en el campo o arreglo. Este índice admite la recuperación de documentos relacionados en una sola query sin el uso de operaciones JOIN de bases de datos.
Considera usar el Single Collection patrón al modelar sistemas con operaciones de alta velocidad, requisitos de baja latencia y operaciones de escritura frecuentes. Dividir el documento en partes más pequeñas, en lugar de grandes documentos incrustados, permite que la base de datos realice operaciones de escritura más pequeñas y mejore el rendimiento.
Acerca de esta tarea
In the following example, an application allows students to see the status of the classes they enroll in for the semester. The system may need to frequently update several fields for each class, such as the current_topic, upcoming_session_summary, or next_class_time. To avoid duplicating information for multiple students taking the same class, we want to keep students and classes as separate document entities in the same collection.
Ejemplo
Considera los siguientes esquemas de ejemplo para una clase y un estudiante. Para modelar su relación, los documentos de clase y estudiante contienen el arreglo links. Este arreglo incluye los campos doc_type y target para hacer referencia a la relación entre los estudiantes y los elementos de la clase.
Documento de la 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 estudiantil:
{ _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, indexa 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, puede query todos los estudiantes inscritos en una determinada clase:
db.students_classes.find({ "doc_type": "student", "links.target": "CS101-001" })