Editar

Padrão de Vista Materializada

Azure Storage

Gere vistas pré-preenchidas sobre os dados em um ou mais arquivos de dados quando os dados não estão formatados idealmente para operações de consulta necessárias. Este procedimento pode ajudar a suportar consultas e extração de dados de forma eficiente e a melhorar o desempenho da aplicação.

Contexto e problema

Ao armazenar dados, a prioridade dos programadores e dos administradores de dados centra-se, muitas vezes, na forma como os dados são armazenados, por oposição à forma como são lidos. Por norma, o formato de armazenamento escolhido está estritamente ligado ao formato dos dados, aos requisitos de gestão do tamanho dos dados e da integridade dos dados e ao tipo de arquivo em utilização. Por exemplo, ao utilizar o arquivo de documentos NoSQL, os dados são frequentemente representados como uma série de agregados, cada um contendo todas as informações dessa entidade.

No entanto, isto pode ter um efeito negativo nas consultas. Quando uma consulta necessita apenas de um subconjunto dos dados de algumas entidades, tal como um resumo das encomendas de vários clientes sem todos os detalhes da encomenda, esta deve extrair todos os dados das entidades relevantes de forma a obter as informações necessárias.

Solução

Uma resolução comum para suportar uma consulta eficiente passa pela criação antecipada de uma vista que materializa os dados num formato adequado para o conjunto de resultados necessário. O padrão de Vista Materializada descreve a geração das vistas pré-preenchida de dados em ambientes onde os dados de origem não estão num formato adequado para consultas, onde é difícil criar uma consulta adequada ou onde o desempenho das consultas é fraco devido à natureza dos dados ou do arquivo de dados.

Estas vistas materializadas, que só contêm dados necessários para uma consulta, permitem que as aplicações obtenham rapidamente as informações de que precisam. Além de unirem tabelas ou combinarem entidades de dados, as vistas materializadas podem incluir os valores atuais das colunas calculadas ou dos itens de dados, os resultados da combinação de valores ou da execução das transformações nos itens de dados e os valores especificados como parte da consulta. Uma vista materializada pode até ser otimizada para apenas uma única consulta.

Um ponto fundamental deste padrão assenta no facto de que a vista materializada e os dados contidos nesta são completamente descartáveis, uma vez que podem ser totalmente reconstruídos a partir dos arquivos de dados de origem. Uma vista materializada nunca é atualizada diretamente por uma aplicação e, por isso, é uma cache especializada.

Quando os dados de origem da vista são alterados, a vista tem de ser atualizada para incluir as novas informações. Pode agendar esta atualização para que ocorra automaticamente ou quando o sistema detetar uma alteração dos dados originais. Em alguns casos, poderá ser necessário regenerar a vista manualmente. A figura mostra um exemplo de como o padrão de Vista Materializada pode ser utilizado.

A Figura 1 mostra um exemplo de como o padrão de Vista Materializada pode ser utilizado

Problemas e considerações

Na altura de decidir como implementar este padrão, considere os seguintes pontos:

Como e quando a vista será atualizada. Idealmente, será regenerada em resposta a um evento que indica uma alteração dos dados de origem, apesar de isso poder dar origem a uma sobrecarga excessiva se os dados de origem forem alterados rapidamente. Em alternativa, considere utilizar uma tarefa agendada, um acionador externo ou uma ação manual para regenerar a vista.

Em alguns sistemas (por exemplo, quando utiliza o padrão de Origem do Evento para manter um arquivo que contém apenas os eventos que modificaram os dados), as vistas materializadas são necessárias. O pré-preenchimento das vistas ao examinar todos os eventos para determinar o estado atual pode ser a única forma de obter informações do arquivo de eventos. Se não estiver a utilizar a Origem do Evento, deve avaliar se a utilização de uma vista materializada é ou não útil. As vistas materializadas tendem a ser especificamente personalizadas para uma consulta ou um pequeno número de consultas. Se forem utilizadas muitas consultas, as vistas materializadas poderão resultar em requisitos de capacidade de armazenamento e custos de armazenamento inaceitáveis.

Considere o impacto da consistência dos dados ao gerar a vista e ao atualizar a vista, caso tal ocorra com base num agendamento. Se a origem de dados sofrer uma alteração na altura em que a vista é gerada, a cópia dos dados na vista não será totalmente consistente com os dados originais.

Considere onde irá armazenar a vista. A vista não tem de estar localizada no mesmo arquivo ou na mesma partição que os dados originais. Esta pode ser um subconjunto de algumas partições diferentes combinadas.

Uma vista perdida pode ser reconstruída. Por esse motivo, se a vista for transitória e apenas utilizada para melhorar o desempenho da consulta ao refletir o estado atual dos dados ou para melhorar a escalabilidade, a vista poderá ser armazenada em cache numa localização menos fiável.

Ao definir uma vista materializada, maximize o seu valor ao adicionar itens de dados ou colunas com base no cálculo ou na transformação de itens de dados existentes, valores transmitidos na consulta ou nas combinações destes valores quando adequado.

Quando suportado pelo mecanismo de armazenamento, considere indexar a vista materializada para melhorar ainda mais o desempenho. A maioria das bases de dados relacionais suportam a indexação das vistas, tal como soluções de macrodados com base no Apache Hadoop.

Quando utilizar este padrão

Este padrão é útil quando:

  • Cria vistas materializadas de dados difíceis de consultar diretamente ou quando as consultas têm de ser muito complexas para extrair dados armazenados de uma forma normalizada, semiestruturada ou não estruturada.
  • Cria vistas temporárias que podem melhorar significativamente o desempenho das consultas ou agir diretamente como vistas de origem ou objetos de transferência de dados para a IU, para os relatórios ou para a apresentação.
  • Suporta cenários ocasionalmente ligados ou desligados em que a ligação ao arquivo de dados não está sempre disponível. A vista pode ser colocado em cache localmente neste caso.
  • Simplifica as consultas e expõe dados para experimentação de uma forma que não requer o conhecimento do formato de dados de origem. Por exemplo, ao associar diferentes tabelas numa ou mais bases de dados ou num ou mais domínios nos arquivos NoSQL e, em seguida, formatar os dados para que se adequem à sua eventual utilização.
  • Fornece acesso a subconjuntos específicos dos dados de origem que, por motivos de segurança ou de privacidade, não devem estar acessíveis de forma geral, disponíveis para modificações ou totalmente exposto aos utilizadores.
  • Une diferentes arquivos de dados, para tirar partido das suas capacidades individuais. Por exemplo, através de um arquivo na cloud eficiente para escrita como o arquivo de dados de referência e uma base de dados relacional que oferece um bom nível de consultas e desempenho de leitura para conter as vistas materializadas.
  • Ao usar microsserviços, recomenda-se mantê-los acoplados de forma flexível, incluindo o armazenamento de dados. Portanto, visualizações materializadas podem ajudá-lo a consolidar dados de seus serviços. Se as visualizações materializadas não forem apropriadas em sua arquitetura de microsserviços ou cenário específico, considere ter limites bem definidos que se alinhem ao DDD (design controlado por domínio) e agreguem seus dados quando solicitado.

Este padrão não é prático nas seguintes situações:

  • A origem de dados é simples e fácil de consultar.
  • A origem de dados é alterada muito rapidamente ou pode ser acedida sem utilizar uma vista. Nestes casos, deve evitar a sobrecarga de processamento da criação de vistas.
  • A consistência é uma prioridade alta. As vistas podem não estar sempre totalmente consistentes com os dados originais.

Design da carga de trabalho

Um arquiteto deve avaliar como o padrão de Modo de Exibição Materializado pode ser usado no design de sua carga de trabalho para abordar as metas e os princípios abordados nos pilares do Azure Well-Architected Framework. Por exemplo:

Pilar Como esse padrão suporta os objetivos do pilar
A Eficiência de Desempenho ajuda sua carga de trabalho a atender às demandas de forma eficiente por meio de otimizações em escala, dados e código. As visualizações materializadas armazenam os resultados de cálculos ou consultas complexas sem exigir que o mecanismo de banco de dados ou o cliente recalcule para cada solicitação. Esse design reduz o consumo geral de recursos.

- PE:08 Desempenho dos dados

Como em qualquer decisão de design, considere quaisquer compensações em relação aos objetivos dos outros pilares que possam ser introduzidos com esse padrão.

Exemplo

A figura seguinte mostra um exemplo da utilização do padrão de Vista Materializada para gerar um resumo de vendas. Os dados nas tabelas Order, OrderItem e Customer em partições separadas numa conta de armazenamento do Azure são combinados para gerar uma vista que contém o valor total de venda para cada produto na categoria Eletrónica, juntamente com uma contagem do número de clientes que compraram cada um dos itens.

Figura 2: Utilizar o padrão de Vista Materializada para gerar um resumo de vendas

A criação desta vista materializada requer consultas complexas. No entanto, ao expor o resultado da consulta como uma vista materializada, os utilizadores podem facilmente obter os resultados e utilizá-los diretamente ou incorporá-los noutra consulta. A vista será provavelmente utilizada num sistema de relatórios ou no dashboard e pode ser atualizada de forma agendada, por exemplo, semanalmente.

Embora este exemplo use o armazenamento de tabelas do Azure, muitos sistemas de gerenciamento de banco de dados relacional também fornecem suporte nativo para exibições materializadas.

Próximos passos

  • Manual Básico de Consistência de Dados. As informações de resumo numa vista materializada têm de ser mantidas para que reflitam os valores dos dados subjacentes. Uma vez que os valores dos dados mudam, pode não ser prático atualizar os dados de resumo em tempo real. Em vez disso, terá de adotar uma abordagem eventualmente consistente. Resume os problemas referentes à conservação da consistência dos dados distribuídos e descreve os benefícios e os compromissos dos diferentes modelos de consistência.

Os seguintes padrões também podem ser relevantes ao implementar esse padrão:

  • Padrão de Segregação das Responsabilidades de Comando e de Consulta (CQRS). Utilize esta opção para atualizar as informações numa vista materializada ao responder a eventos que ocorrem quando os valores dos dados subjacentes são alterados.
  • Padrão de Origem do Evento. Utilize em conjunto com o padrão de CQRS para manter as informações numa vista materializada. Quando os valores dos dados baseados numa vista materializada são alterados, o sistema pode gerar eventos que descrevem estas alterações e guarda-os num arquivo de eventos.
  • Padrão de Tabela de Índice. Por norma, os dados numa vista materializada estão organizados por uma chave primária, mas as consultas podem ter de obter informações a partir desta vista ao examinar os dados noutros campos. Utilize para criar índices secundários através de conjuntos de dados para os arquivos de dados que não suportam índices secundários nativos.