Agrupar dados com o padrão outlier
Nesta página
Se sua coleção armazena documentos do mesmo tamanho e formato, um documento drasticamente diferente (um valor atípico) pode causar problemas de desempenho para querys comuns.
Considere uma coleção que armazena um campo de array. Se um documento contiver muito mais elementos de array do que outros documentos da coleção, talvez seja necessário tratá-lo de maneira diferente no seu esquema.
Use o padrão de discrepância (outlier) para isolar documentos que não correspondam ao formato esperado em comparação ao restante da sua coleção. Seu esquema ainda mantém todos os mesmos dados, mas as queries comuns não são afetadas por um único documento grande.
Antes de começar
Antes de modificar seu esquema para lidar com outliers, considere os prós e os contras do padrão de outlier:
Prós
O padrão de discrepância (outlier) melhora o desempenho de queries executadas com frequência. As queries que retornam documentos típicos não precisam retornar também documentos discrepantes grandes.
O padrão discrepante também lida com casos extremos no aplicativo. Por exemplo, se seu aplicativo normalmente exibe 50 resultados de uma matriz, não haverá um documento que contenha 2.000 resultados que interrompa a experiência do usuário.
Contras
O padrão outlier requer lógica mais complexa para lidar com atualizações. Se você precisar atualizar seus dados com frequência, convém considerar outros padrões de design de esquema. Para obter mais informações, consulte Atualizações para outliers.
Sobre esta tarefa
Considere um esquema que rastreia as vendas de livros. Documentos típicos na coleção terão a seguinte aparência:
db.sales.insertOne( { "_id": 1, "title": "Invisible Cities", "year": 1972, "author": "Italo Calvino", "customers_purchased": [ "user00", "user01", "user02" ] } )
A matriz customers_purchased
é ilimitada, o que significa que, à medida que mais clientes compram um livro, a matriz fica maior. Para a maioria dos documentos, isso não é um problema porque a loja não espera mais do que algumas vendas para um determinado livro.
Suponha que um livro novo e popular resulte em um grande número de compras. O design do esquema atual resulta em um documento inchado, o que impacta negativamente o desempenho. Para resolver esse problema, implemente o padrão de discrepância para documentos que não tenham uma quantidade típica de vendas.
Passos
Identifique um limite para discrepâncias (outliers)
Dada a estrutura típica do documento do esquema, identifique quando um documento se torna um outlier. O limite pode ser baseado nas exigências da interface do usuário do seu aplicativo ou nas consultas que você executa em seus documentos.
Neste exemplo, um livro com mais de 50 vendas é discrepante.
Adicione um indicador para documentos discrepantes
Para livros com mais de 50 vendas, adicione um novo campo de documento chamado has_extras
e defina o valor como true
. Esse campo indica que há mais vendas armazenadas em uma coleção separada.
db.sales.insertOne( { "_id": 2, "title": "The Wooden Amulet", "year": 2023, "author": "Lesley Moreno", "customers_purchased": [ "user00", "user01", "user02", ... "user49" ], "has_extras": true } )
Armazene vendas adicionais em uma coleção separada
Crie uma coleção chamada extra_sales
para armazenar vendas além das 50 inicial. Vincule documentos da coleção extra_sales
à coleção sales
com uma referência:
db.extra_sales.insertOne( { "book_id": 2, "customers_purchased_extra": [ "user50", "user51", "user52", ... "user999" ] } )
Resultados
O padrão outlier impede que documento atípicos impacto o desempenho da query. O esquema resultante evita documento grandes na coleção e, ao mesmo tempo, mantém uma lista completa de vendas.
Considere uma página de aplicativo que mostre informações sobre um livro e todos os usuários que compraram esse livro. Depois de implementar o padrão de discrepância, a página exibe informações para a maioria dos livros (documentos típicos) rapidamente.
Para livros populares (outliers), o aplicativo realiza uma query adicional na coleção extra_sales
em book_id
. Para melhorar o desempenho desta consulta, você pode criar um índice no campo book_id
.
Atualizações sobre Outliers
Você precisa lidar com atualizações para documentos atípicos de forma diferente dos documentos típicos. A lógica usada para executar atualizações depende do design do esquema.
Para executar atualizações para outliers para o esquema anterior, implemente a seguinte lógica de aplicativo:
Verifique se o documento que está sendo atualizado tem
has_extras
definido comotrue
.Se
has_extras
estiver ausente ou forfalse
, adicione as novas compras à coleçãosales
.Se a array
customers_purchased
resultante contiver mais de 50 elementos, definahas_extras
comotrue
.
Se
has_extras
fortrue
, adicione as novas compras à coleçãosales_extras
para obook_id
correspondente.