MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Projetando relacionamentos muitos para muitos no MongoDB (em vez de tabelas relacionais)


Este é um caso de ter os dados com relacionamento muitos-para-muitos. Eu acho que existem alguns milhares de alunos e algumas centenas de cursos em seu banco de dados.

Para começar, posso usar o seguinte design com detalhes do curso incorporados a cada aluno como uma matriz de subdocumentos chamados courses .
- students collection
id:
name:
courses: [ { id: 1, name: },  { id: 5, name: }, ... ]

- courses collection
id:
name:
description:

Observe que o ID e o nome do curso são armazenados em ambas as coleções. Isso é duplicação de dados. Isso deve ser bom, pois os detalhes duplicados não mudam com frequência (ou podem não mudar).

Consulte todos os cursos em que um aluno está matriculado, por exemplo:db.students.find( { name: "John" } ) . Isso retornará um documento do aluno com o nome correspondente e todos os cursos (o campo de matriz). Consulte db.collection.find .

Consulte todos os alunos matriculados em um curso específico:db.students.find( { "courses.name": "Java Programming" } ) . Isso retornará todos os documentos do aluno que tenham o nome do curso que corresponda aos critérios "Programação java". Consulte Consulte uma matriz de documentos incorporados .

Além disso, você pode usar projeção para excluir e incluir campos do resultado.

OBSERVAÇÕES:
  • Você pode incorporar as informações dos alunos na coleção de cursos, em vez dos cursos nos alunos. As consultas serão semelhantes às anteriores, mas você estará consultando a coleção de cursos. Depende do seu caso de uso.
  • Você pode apenas armazenar o campo id do curso no array de cursos, da coleção de alunos; este é o caso em que o campo do nome do curso é alterado com frequência. As consultas usarão Agregação $lookup (uma operação "join") para obter o curso e da coleção de cursos.
  • Informações sobre Design de modelo de dados para dados MongoDB baseados em documentos.