Padrão de Vista MaterializadaMaterialized View pattern

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.Generate prepopulated views over the data in one or more data stores when the data isn't ideally formatted for required query operations. Este procedimento pode ajudar a suportar consultas e extração de dados de forma eficiente e a melhorar o desempenho da aplicação.This can help support efficient querying and data extraction, and improve application performance.

Contexto e problemaContext and problem

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.When storing data, the priority for developers and data administrators is often focused on how the data is stored, as opposed to how it's read. 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.The chosen storage format is usually closely related to the format of the data, requirements for managing data size and data integrity, and the kind of store in use. 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.For example, when using NoSQL document store, the data is often represented as a series of aggregates, each containing all of the information for that entity.

No entanto, isto pode ter um efeito negativo nas consultas.However, this can have a negative effect on queries. 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.When a query only needs a subset of the data from some entities, such as a summary of orders for several customers without all of the order details, it must extract all of the data for the relevant entities in order to obtain the required information.

SoluçãoSolution

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.To support efficient querying, a common solution is to generate, in advance, a view that materializes the data in a format suited to the required results set. 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.The Materialized View pattern describes generating prepopulated views of data in environments where the source data isn't in a suitable format for querying, where generating a suitable query is difficult, or where query performance is poor due to the nature of the data or the data store.

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.These materialized views, which only contain data required by a query, allow applications to quickly obtain the information they need. 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.In addition to joining tables or combining data entities, materialized views can include the current values of calculated columns or data items, the results of combining values or executing transformations on the data items, and values specified as part of the query. Uma vista materializada pode até ser otimizada para apenas uma única consulta.A materialized view can even be optimized for just a single query.

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.A key point is that a materialized view and the data it contains is completely disposable because it can be entirely rebuilt from the source data stores. Uma vista materializada nunca é atualizada diretamente por uma aplicação e, por isso, é uma cache especializada.A materialized view is never updated directly by an application, and so it's a specialized cache.

Quando os dados de origem da vista são alterados, a vista tem de ser atualizada para incluir as novas informações.When the source data for the view changes, the view must be updated to include the new information. Pode agendar esta atualização para que ocorra automaticamente ou quando o sistema detetar uma alteração dos dados originais.You can schedule this to happen automatically, or when the system detects a change to the original data. Em alguns casos, poderá ser necessário regenerar a vista manualmente.In some cases it might be necessary to regenerate the view manually. A figura mostra um exemplo de como o padrão de Vista Materializada pode ser utilizado.The figure shows an example of how the Materialized View pattern might be used.

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

Problemas e consideraçõesIssues and considerations

Na altura de decidir como implementar este padrão, considere os seguintes pontos:Consider the following points when deciding how to implement this pattern:

Como e quando a vista será atualizada.How and when the view will be updated. 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.Ideally it'll regenerate in response to an event indicating a change to the source data, although this can lead to excessive overhead if the source data changes rapidly. Em alternativa, considere utilizar uma tarefa agendada, um acionador externo ou uma ação manual para regenerar a vista.Alternatively, consider using a scheduled task, an external trigger, or a manual action to regenerate the view.

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.In some systems, such as when using the Event Sourcing pattern to maintain a store of only the events that modified the data, materialized views are necessary. 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.Prepopulating views by examining all events to determine the current state might be the only way to obtain information from the event store. Se não estiver a utilizar a Origem do Evento, deve avaliar se a utilização de uma vista materializada é ou não útil.If you're not using Event Sourcing, you need to consider whether a materialized view is helpful or not. As vistas materializadas tendem a ser especificamente personalizadas para uma consulta ou um pequeno número de consultas.Materialized views tend to be specifically tailored to one, or a small number of queries. Se forem utilizadas muitas consultas, as vistas materializadas poderão resultar em requisitos de capacidade de armazenamento e custos de armazenamento inaceitáveis.If many queries are used, materialized views can result in unacceptable storage capacity requirements and storage cost.

Considere o impacto da consistência dos dados ao gerar a vista e ao atualizar a vista, caso tal ocorra com base num agendamento.Consider the impact on data consistency when generating the view, and when updating the view if this occurs on a schedule. 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.If the source data is changing at the point when the view is generated, the copy of the data in the view won't be fully consistent with the original data.

Considere onde irá armazenar a vista.Consider where you'll store the view. A vista não tem de estar localizada no mesmo arquivo ou na mesma partição que os dados originais.The view doesn't have to be located in the same store or partition as the original data. Esta pode ser um subconjunto de algumas partições diferentes combinadas.It can be a subset from a few different partitions combined.

Uma vista perdida pode ser reconstruída.A view can be rebuilt if lost. 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.Because of that, if the view is transient and is only used to improve query performance by reflecting the current state of the data, or to improve scalability, it can be stored in a cache or in a less reliable location.

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.When defining a materialized view, maximize its value by adding data items or columns to it based on computation or transformation of existing data items, on values passed in the query, or on combinations of these values when appropriate.

Quando suportado pelo mecanismo de armazenamento, considere indexar a vista materializada para melhorar ainda mais o desempenho.Where the storage mechanism supports it, consider indexing the materialized view to further increase performance. A maioria das bases de dados relacionais suportam a indexação das vistas, tal como soluções de macrodados com base no Apache Hadoop.Most relational databases support indexing for views, as do big data solutions based on Apache Hadoop.

Quando utilizar este padrãoWhen to use this pattern

Este padrão é útil quando:This pattern is useful when:

  • 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.Creating materialized views over data that's difficult to query directly, or where queries must be very complex to extract data that's stored in a normalized, semi-structured, or unstructured way.
  • 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.Creating temporary views that can dramatically improve query performance, or can act directly as source views or data transfer objects for the UI, for reporting, or for display.
  • Suporta cenários ocasionalmente ligados ou desligados em que a ligação ao arquivo de dados não está sempre disponível.Supporting occasionally connected or disconnected scenarios where connection to the data store isn't always available. A vista pode ser colocado em cache localmente neste caso.The view can be cached locally in this case.
  • 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.Simplifying queries and exposing data for experimentation in a way that doesn't require knowledge of the source data format. 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.For example, by joining different tables in one or more databases, or one or more domains in NoSQL stores, and then formatting the data to fit its eventual use.
  • 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.Providing access to specific subsets of the source data that, for security or privacy reasons, shouldn't be generally accessible, open to modification, or fully exposed to users.
  • Une diferentes arquivos de dados, para tirar partido das suas capacidades individuais.Bridging different data stores, to take advantage of their individual capabilities. 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.For example, using a cloud store that's efficient for writing as the reference data store, and a relational database that offers good query and read performance to hold the materialized views.

Este padrão não é prático nas seguintes situações:This pattern isn't useful in the following situations:

  • A origem de dados é simples e fácil de consultar.The source data is simple and easy to query.
  • A origem de dados é alterada muito rapidamente ou pode ser acedida sem utilizar uma vista.The source data changes very quickly, or can be accessed without using a view. Nestes casos, deve evitar a sobrecarga de processamento da criação de vistas.In these cases, you should avoid the processing overhead of creating views.
  • A consistência é uma prioridade alta.Consistency is a high priority. As vistas podem não estar sempre totalmente consistentes com os dados originais.The views might not always be fully consistent with the original data.

ExemploExample

A figura seguinte mostra um exemplo da utilização do padrão de Vista Materializada para gerar um resumo de vendas.The following figure shows an example of using the Materialized View pattern to generate a summary of sales. 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.Data in the Order, OrderItem, and Customer tables in separate partitions in an Azure storage account are combined to generate a view containing the total sales value for each product in the Electronics category, along with a count of the number of customers who made purchases of each item.

Figura 2: Utilizar o padrão de vista materializada para gerar um resumo de vendas

A criação desta vista materializada requer consultas complexas.Creating this materialized view requires complex queries. 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.However, by exposing the query result as a materialized view, users can easily obtain the results and use them directly or incorporate them in another query. A vista será provavelmente utilizada num sistema de relatórios ou no dashboard e pode ser atualizada de forma agendada, por exemplo, semanalmente.The view is likely to be used in a reporting system or dashboard, and can be updated on a scheduled basis such as weekly.

Embora este exemplo utilize o armazenamento de tabelas do Azure, muitos sistemas de gestão de bases de dados relacionais também fornecem suporte nativo para as vistas materializadas.Although this example utilizes Azure table storage, many relational database management systems also provide native support for materialized views.

Os padrões e orientações que se seguem também podem ser relevantes ao implementar este padrão:The following patterns and guidance might also be relevant when implementing this pattern:

  • Manual Básico de Consistência de Dados.Data Consistency Primer. As informações de resumo numa vista materializada têm de ser mantidas para que reflitam os valores dos dados subjacentes.The summary information in a materialized view has to be maintained so that it reflects the underlying data values. 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.As the data values change, it might not be practical to update the summary data in real time, and instead you'll have to adopt an eventually consistent approach. 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.Summarizes the issues surrounding maintaining consistency over distributed data, and describes the benefits and tradeoffs of different consistency models.
  • Padrão de Segregação das Responsabilidades de Comando e de Consulta (CQRS).Command and Query Responsibility Segregation (CQRS) pattern. 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.Use to update the information in a materialized view by responding to events that occur when the underlying data values change.
  • Padrão de Origem do Evento.Event Sourcing pattern. Utilize em conjunto com o padrão de CQRS para manter as informações numa vista materializada.Use in conjunction with the CQRS pattern to maintain the information in a materialized view. 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.When the data values a materialized view is based on are changed, the system can raise events that describe these changes and save them in an event store.
  • Padrão de Tabela de Índice.Index Table pattern. 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.The data in a materialized view is typically organized by a primary key, but queries might need to retrieve information from this view by examining data in other fields. 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.Use to create secondary indexes over data sets for data stores that don't support native secondary indexes.