Construindo com padrões: o padrão Subset
Avalie esse Tutorial
Alguns anos atrás, os primeiros PCs tinham 256KB de RAM e 5 duplos .25"drives de disquete. Sem discos rígidos, pois eram incrivelmente caros na época. Essas limitações resultaram na necessidade de trocar físicamente os disquetes devido à falta de memória ao trabalhar com grandes (para a época) quantidades de dados. Se ao menos havia uma maneira de trazer para a memória apenas os dados que eu usava com frequência, como em um subconjunto dos dados gerais.
Aplicativos modernos não estão isentos de recursos exaustivos. O MongoDB mantém os dados acessados com frequência, conhecidos como o conjunto de trabalho, no RAM. Quando o conjunto de trabalho de dados e índices cresce além da RAM física alocada, o desempenho é reduzido à medida que os acessos ao disco começam a ocorrer e os dados saem da RAM.
Como podemos resolver isso? Primeiro, poderíamos adicionar mais RAM ao servidor. Mas isso só escala muito. Podemos tentar fragmentar nossa coleção, mas isso acarreta custos e complexidades adicionais para os quais nosso aplicativo pode não estar pronto. Outra opção é reduzir o tamanho do nosso conjunto de trabalho. É aqui que podemos aproveitar o padrão de subconjunto.
Esse padrão aborda os problemas associados a um conjunto de trabalho que excede a RAM, resultando na remoção de informações da memória. Isso geralmente é causado por documentos grandes que contêm muitos dados que não são realmente usados pelo aplicativo. O que significa isso exatamente?
Imagine um site de comércio eletrônico que tenha uma lista de avaliações de um produto. Ao acessar os dados desse produto, é bem possível que precisemos apenas das dez avaliações mais recentes. Extrair a totalidade dos dados do produto com todas as avaliações poderia facilmente fazer com que o conjunto de trabalho se expandisse.
Em vez de armazenar todas as avaliações com o produto, podemos dividir a coleção em duas coleções. Uma collection teria os dados usados com mais frequência, por exemplo as revisões atuais e a outra collection teriam dados usados com menos frequência, por exemplo análises antigas, histórico do produto, etc. Podemos duplicar parte de um relacionamento 1-N ou NN que é usado pelo lado mais usado do relacionamento.
Na coleçãoProdutos, manteremos apenas as dez avaliações mais recentes. Isso permite que o conjunto de trabalho seja reduzido ao trazer apenas uma parte, ou subconjunto, dos dados gerais. As informações adicionais, as avaliações neste exemplo, são armazenadas em uma coleção separada de Revisões que pode ser acessada se o usuário quiser ver avaliações adicionais. Ao considerar onde fazer a divisão dos seus dados, a parte mais usada do documento deve Go para a collection "principal" e os dados usados com menos frequência em outra. Para nossas avaliações, essa divisão pode ser o número de avaliações visíveis na página do produto.
O Subset Pattern é muito útil quando temos uma grande parte dos dados em um documento que raramente é necessária. Resenhas de produtos, comentários de artigos, atores em um filme são exemplos de casos de uso desse padrão. Sempre que o tamanho do documento estiver pressionando o tamanho do conjunto de trabalho e fazendo com que o conjunto de trabalho exceda a capacidade de RAM do computador, o padrão de subconjunto é uma opção a ser considerada.
Ao usar documentos menores com dados acessados com mais frequência, reduzimos o tamanho geral do conjunto de trabalho. Isso permite tempos de acesso ao disco mais curtos para as informações usadas com mais frequência que um aplicativo precisa. Uma compensação que devemos fazer ao usar o padrão de subconjunto é que devemos gerenciar o subconjunto e também, se precisarmos extrair revisões mais antigas ou todas as informações, serão necessárias viagens adicionais ao banco de dados para isso.