Crie um modelo de dados que use um array de referências para agrupar documentos relacionados de diferentes tipos em uma única collection. O Padrão de Coleção Única pode ser especialmente útil para modelar relacionamentos de muitos para muitos com apenas uma cópia dos dados. Esse padrão pode reduzir a duplicação de dados em casos de uso em que o custo da duplicação é uma preocupação.
As seguintes características definem o Padrão de Coleção Única:
Armazena todos os documentos acessados com frequência juntos em uma única collection.
Armazena relacionamentos entre documentos como ponteiros ou estruturas dentro de cada documento.
Mapeia as relações entre documentos por meio de índices no campo ou array. Esse índice oferece suporte à recuperação de documentos relacionados em uma única query sem o uso de operações de junção de banco de dados .
Considere usar o padrão de collection única ao modelar sistemas com operações de alta velocidade, requisitos de baixa latência e operações de escrita frequentes. Ao dividir o documento em partes menores, em vez de grandes documentos incorporados, o banco de dados pode executar operações de gravação menores e melhorar o desempenho.
Sobre esta tarefa
No exemplo a seguir, um aplicação permite que os alunos vejam o status das turmas em que se inscreveram no semestre. O sistema pode precisar atualizar com frequência vários campos para cada classe, como current_topic, upcoming_session_summary ou next_class_time. Para evitar a duplicação de informações para vários alunos que cursam a mesma classe, queremos manter os alunos e as classes como entidades de documento separadas na mesma collection.
Exemplo
Considere os seguintes esquemas de exemplo para uma classe e um aluno. Para modelar seu relacionamento, os documentos da classe e do aluno contêm a array links. Essa array inclui os campos doc_type e target para fazer referência ao relacionamento entre o aluno e as entidades de classe .
documento de classe :
{ _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 do aluno :
{ _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 otimizar queries, indexe o campo links :
db.students_classes.createIndex({ "links.target": 1, "links.doc_type": 1 })
Você pode fazer query das informações de um aluno e de todas as aulas que ele faz sem precisar realizar nenhuma operação de junção:
db.students_classes.find({ "links.target": "S12345" })
Da mesma forma, você pode consultar todos os alunos registrados em uma determinada classe:
db.students_classes.find({ "doc_type": "student", "links.target": "CS101-001" })