A forma como você mapeia relacionamentos entre entidades de dados afeta o desempenho e a escalabilidade do aplicativo.
A maneira recomendada de lidar com dados relacionados é incorporá-los em um subdocumento. A incorporação de dados relacionados permite que seu aplicação consulte os dados necessários com uma única operação de leitura e evite operações $lookup lentas.
Para alguns casos de uso, você pode usar uma referência para ponto para dados relacionados em uma coleção separada.
Sobre esta tarefa
Para determinar se você deve incorporar dados relacionados ou usar referências, considere a importância relativa das seguintes metas para seu aplicativo:
- Melhorar as consultas sobre dados relacionados
- Se seu aplicativo frequentemente query uma entidade para retornar dados sobre outra entidade, incorpore os dados para evitar a necessidade de operações frequentes de
$lookup. - Melhorar os dados retornados de diferentes entidades
- Se o seu aplicativo retornar dados de entidades relacionadas em conjunto, incorpore os dados em uma única coleção.
- Melhore o desempenho da atualização
- Se o seu aplicativo atualiza frequentemente os dados relacionados, considere armazenar os dados em sua própria coleção e usar uma referência para acessá-los. Ao usar uma referência, você reduz a carga de trabalho de gravação do seu aplicativo, pois só precisa atualizar os dados em um único local.
Para aprender mais sobre os benefícios de dados e referências incorporados, consulte Vincular dados relacionados.
Passos
Identificar dados relacionados em seu esquema
Identifique os dados que sua aplicação consulta e como as entidades se relacionam entre si.
Considere as operações identificadas a partir da carga de trabalho do aplicativo na etapa Identificar a carga de trabalho do aplicativo. Observe as informações que essas operações gravam e retornam, e quais informações se sobrepõem entre várias operações.
Crie um mapa de esquema para seus dados relacionados
Seu mapa de esquema deve mostrar campos de dados relacionados e o tipo de relação entre esses campos (um-para-um, um-para-muitos, muitos-para-muitos).
Seu mapa de esquema pode se assemelhar a um modelo entidade-relacionamento do.
Escolha se deseja incorporar dados relacionados ou usar referências
A decisão de incorporar dados ou usar referências depende das queries comuns do seu aplicativo. Revisar as queries que você identificou na primeira etapa do processo de projeto de esquema e use as diretrizes mencionadas anteriormente nesta página para projetar seu esquema.
Configure seus bancos de dados, coleções e a lógica de seus aplicativos de acordo com a abordagem que você escolher.
Exemplos
Os exemplos a seguir mostram como otimizar seu esquema para diferentes queries, dependendo das necessidades de sua aplicação.
Os exemplos nesta página usam dados do conjunto de dados de amostra sample_mflix. Para obter detalhes sobre como carregar esse conjunto de dados em sua implantação autogerenciada do MongoDB , consulte Carregar o conjunto de dados de amostra. Se você fez modificações nos bancos de dados de amostra, talvez seja necessário descartar e recriar os bancos de dados para executar os exemplos nesta página.
Otimizar consultas para filmes
Se seu aplicação consultar campos de filmes como title, incorpore informações relacionadas na coleção movies. A incorporação de dados retorna tudo o que o aplicação precisa em uma única operação.
O seguinte documento otimiza queries sobre filmes:
db.movies.insertOne( { title: "The Brutalist", year: 2024, runtime: 215, genres: [ "Drama", "History" ], comments: [ { name: "joel_m", email: "joel_m@gameofthron.es", text: "Visually stunning!" } ], user: { name: "Joel M", email: "joel_m@gameofthron.es" } } )
Otimizar queries para filmes e usuários
Se o seu aplicação retornar informações de filme e informações de usuário separadamente, considere armazenar filmes e usuários em coleções separadas. Esse design de esquema reduz o trabalho necessário para retornar informações do usuário e permite retornar apenas informações do usuário sem incluir campos desnecessários.
No esquema seguinte, a coleção movies contém um campo userId , que é uma referência à coleção users.
Collection de filmes
db.movies.insertOne( { title: "A Complete Unknown", year: 2024, runtime: 141, genres: [ "Biography", "Drama", "Music" ], userId: 987 } )
Collection de usuários
db.users.insertOne( { _id: 987, name: "Joel M", email: "joel_m@gameofthron.es" } )
Próximos passos
Depois de mapear os relacionamentos dos dados do seu aplicativo, a próxima etapa no processo de design do esquema é aplicar padrões de design para otimizar seu esquema. Consulte Aplicar padrões de design.