Шаблон материализованного представленияMaterialized View pattern

Создание предварительно заполненных представлений на основе данных из одного или нескольких хранилищ данных, когда данные не отформатированы для требуемых операций запросов.Generate prepopulated views over the data in one or more data stores when the data isn't ideally formatted for required query operations. Это позволяет эффективно отправлять запросы и извлекать данные, а также повысить производительность приложения.This can help support efficient querying and data extraction, and improve application performance.

Контекст и проблемаContext and problem

При сохранении данных разработчики и администраторы часто уделяют основное внимание способу хранения, а не способу чтения.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. Выбор формата хранилища обычно зависит от формата данных, требований к управлению размером данных и их целостностью, а также от используемого вида хранилища.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. Например, при использовании хранилища документов NoSQL данные часто представляют собою серию агрегатов, каждый из которых содержит всю информацию для данной сущности.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.

Однако это может отрицательно влиять на запросы.However, this can have a negative effect on queries. Если для запроса требуется только подмножество данных из нескольких объектов, например сводка о заказах нескольких клиентов без подробностей о самом заказе, чтобы получить необходимую информацию, запросу необходимо извлечь все данные для соответствующих объектов.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.

РешениеSolution

Для эффективного выполнения запросов обычно заранее создается представление, которое материализует данные в формате, подходящем для необходимого набора результатов.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. Шаблон материализованного представления описывает создание заполненных представлений данных в тех случаях, когда формат исходных данных не подходит для запросов, когда сложно создать подходящий запрос или в случае низкой производительности запроса из-за типа данных или хранилища данных.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.

Материализованные представления, содержащие только данные, необходимые для запроса, позволяют приложениям быстро получить необходимую информацию.These materialized views, which only contain data required by a query, allow applications to quickly obtain the information they need. Помимо соединения таблиц или объединения сущностей данных, материализованные представления могут включать текущие значения вычисляемых столбцов или элементов данных, результаты объединения значений или преобразования элементов данных, а также значения, указанные как часть запроса.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. Материализованное представление можно даже оптимизировать для одного запроса.A materialized view can even be optimized for just a single query.

Важно отметить, что материализованное представление и содержащиеся в нем данные можно удалить и полностью создать заново из хранилищ исходных данных.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. Материализованное представление не обновляется приложением напрямую, оно представляет собой специализированный кэш.A materialized view is never updated directly by an application, and so it's a specialized cache.

Если исходные данные представления изменяются, его необходимо обновить, чтобы добавить новую информацию.When the source data for the view changes, the view must be updated to include the new information. Для этого можно настроить автоматическое обновление по графику или по мере обнаружения системой изменений в исходных данных.You can schedule this to happen automatically, or when the system detects a change to the original data. Иногда может понадобиться вручную создать представление повторно.In some cases it might be necessary to regenerate the view manually. На рисунке показан пример использования шаблона материализованного представления.The figure shows an example of how the Materialized View pattern might be used.

На рисунке 1 показан пример использования шаблона материализованного представления.

Проблемы и рекомендацииIssues and considerations

При принятии решения о реализации этого шаблона необходимо учитывать следующие моменты.Consider the following points when deciding how to implement this pattern:

Как и когда представление будет обновляться.How and when the view will be updated. В идеале оно должно повторно создаваться в ответ на событие, обозначающее изменение исходных данных. Хотя, если данные изменяются быстро, такое поведение может привести к слишком большой нагрузке.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. Кроме того, для повторного создания представления можно использовать запланированную задачу, внешний триггер или сделать это вручную.Alternatively, consider using a scheduled task, an external trigger, or a manual action to regenerate the view.

В некоторых системах использование материализованного представления необходимо. Например, при использовании шаблона источников событий для хранения только событий изменения данных.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. Предварительное заполнение представлений путем проверки всех событий для определения текущего состояния может быть единственным способом получить данные из хранилища событий.Prepopulating views by examining all events to determine the current state might be the only way to obtain information from the event store. Если источники событий не используются, необходимо рассмотреть целесообразность использования материализованного представления.If you're not using Event Sourcing, you need to consider whether a materialized view is helpful or not. Как правило, материализованные представления предназначены для одного запроса или небольшого количества запросов.Materialized views tend to be specifically tailored to one, or a small number of queries. При использовании большого количества запросов материализованные представления могут привести к неприемлемым требованиям к емкости хранилища и затратам на него.If many queries are used, materialized views can result in unacceptable storage capacity requirements and storage cost.

Следует учитывать влияние на согласованность данных при создании и обновлении представления, если обновление происходит по расписанию.Consider the impact on data consistency when generating the view, and when updating the view if this occurs on a schedule. Если в момент создания представления происходит изменение исходных данных, копия данных в представлении не будет полностью соответствовать исходным данным.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.

Необходимо учитывать место для хранения представления.Consider where you'll store the view. Представление не обязательно должно находиться в том же хранилище или разделе, что и исходные данные.The view doesn't have to be located in the same store or partition as the original data. Оно может представлять собой подмножество, объединенное из нескольких различных разделов.It can be a subset from a few different partitions combined.

В случае утраты представление можно повторно создать.A view can be rebuilt if lost. Поэтому, если представление является временным и используется только для повышения производительности запросов, отражая текущее состояние данных, или используется для повышения масштабируемости, оно может храниться в кэше или в менее надежном расположении.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.

При определении материализованного представления его эффективность можно повысить, добавив в него элементы данных или столбцы с результатами вычисления или преобразования существующих элементов данных, столбцы со значениями, передаваемыми в запросе, или сочетаниями этих значений (при необходимости).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.

Если механизм хранилища поддерживает такую возможность, рекомендуется индексировать материализованное представление для еще большего повышения производительности.Where the storage mechanism supports it, consider indexing the materialized view to further increase performance. Большинство реляционных баз данных, а также решения для обработки больших объемов данных на основе Apache Hadoop поддерживают индексирование представлений.Most relational databases support indexing for views, as do big data solutions based on Apache Hadoop.

Когда следует использовать этот шаблонWhen to use this pattern

Этот шаблон полезен в следующих сценариях.This pattern is useful when:

  • Создание материализованных представлений данных, для которых сложно создать прямой запрос. Также можно использовать этот шаблон, когда запросы должны быть очень сложными, чтобы извлечь данные, хранящиеся в нормализованном, частично структурированном или неструктурированном виде.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.
  • Создание временных представлений, способных значительно повысить производительность запроса либо способных выступать непосредственно в качестве исходных представлений или объектов передачи данных для пользовательского интерфейса, создания отчетов или отображения.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.
  • Поддержка сценариев временного подключения или временного отключения, когда подключение к хранилищу данных не всегда доступно.Supporting occasionally connected or disconnected scenarios where connection to the data store isn't always available. В этом случае представление можно кэшировать локально.The view can be cached locally in this case.
  • Упрощение запросов и предоставление данных для экспериментов таким образом, чтобы информация о формате исходных данных не требовалась.Simplifying queries and exposing data for experimentation in a way that doesn't require knowledge of the source data format. Например, это делается путем объединения разных таблиц в одну или несколько баз данных либо одного или нескольких доменов в хранилищах NoSQL и последующего форматирования данных в соответствии со способом использования.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.
  • Предоставление доступа к определенным подмножествам исходных данных, которые из соображений безопасности или конфиденциальности не должны быть общедоступными, доступными для изменений или полностью открытыми для пользователей.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.
  • Использования моста для различных хранилищ данных для воспользоваться конкретными возможностями каждого из них.Bridging different data stores, to take advantage of their individual capabilities. Например, использование облачного хранилища, эффективного для записи в качестве ссылочного хранилища данных, и реляционной базы данных, предлагающей хорошую производительность запросов и операций чтения для хранения материализованных представлений.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.

Этот шаблон не будет полезен в следующих сценариях.This pattern isn't useful in the following situations:

  • Используются простые исходные данные, для которых легко создавать запросы.The source data is simple and easy to query.
  • Исходные данные меняются очень быстро или доступ к ним можно осуществлять без использования представления.The source data changes very quickly, or can be accessed without using a view. В таких случаях следует избегать дополнительной нагрузки в виде создания представлений.In these cases, you should avoid the processing overhead of creating views.
  • Согласованность имеет высокий приоритет.Consistency is a high priority. Представления могут быть не всегда полностью согласованными с исходными данными.The views might not always be fully consistent with the original data.

ПримерExample

На рисунке ниже показан пример использования шаблона материализованного представления для создания сводки о продажах.The following figure shows an example of using the Materialized View pattern to generate a summary of sales. Данные в таблицах Order (Заказ), OrderItem (Товар заказа) и Customer (Клиент) в разных разделах учетной записи хранения Azure объединены в представление, которое содержит значение общих продаж для каждого товара в категории "Электроника", а также количество клиентов, купивших каждый товар.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.

Рисунок 2. Использование шаблона материализованного представления для создания сводки о продажах

Для создания этого материализованного представления необходимы сложные запросы.Creating this materialized view requires complex queries. Получив результаты запроса в виде материализованного представления, пользователи могут легко использовать их напрямую или встроить в другой запрос.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. Представление можно использовать в системе отчетности или панели мониторинга. Его можно обновлять по определенному графику, например каждую неделю.The view is likely to be used in a reporting system or dashboard, and can be updated on a scheduled basis such as weekly.

Хотя в этом примере используется хранилище таблиц Azure, многие системы управления реляционными базами данных также предоставляют встроенную поддержку материализованных представлений.Although this example utilizes Azure table storage, many relational database management systems also provide native support for materialized views.

При реализации этого шаблона следует принять во внимание следующие шаблоны и рекомендации.The following patterns and guidance might also be relevant when implementing this pattern:

  • Data Consistency Primer (Руководство по обеспечению согласованности данных).Data Consistency Primer. Необходимо поддерживать актуальность сводных данных в материализованном представлении, чтобы оно точно отражало значения базовых данных.The summary information in a materialized view has to be maintained so that it reflects the underlying data values. По мере изменения значений данных обновление сводных данных в режиме реального времени может оказаться нецелесообразным. Вместо этого необходимо будет использовать другой подход, обеспечивающий согласованность.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. Здесь кратко описаны проблемы, связанные с поддержанием согласованности распределенных данных, и описываются преимущества и недостатки различных моделей согласованности.Summarizes the issues surrounding maintaining consistency over distributed data, and describes the benefits and tradeoffs of different consistency models.
  • Шаблон выделения ответственности команды и запроса (CQRS).Command and Query Responsibility Segregation (CQRS) pattern. Используйте для обновления сведений в материализованном представлении в ответ на события, возникающие при изменении значений данных.Use to update the information in a materialized view by responding to events that occur when the underlying data values change.
  • Шаблон источников событий.Event Sourcing pattern. Используйте этот шаблон вместе с шаблоном выделения ответственности команды и запроса для поддержания актуальности информации в материализованном представлении.Use in conjunction with the CQRS pattern to maintain the information in a materialized view. При изменении значений данных, на которых основывается материализованное представление, система может выдать события, описывающие эти изменения, и сохранить их в хранилище событий.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.
  • Index Table pattern (Шаблон таблицы индексов).Index Table pattern. Данные в материализованном представлении обычно организованы по первичному ключу, но для выполнения запросов может понадобиться получение сведений из этого представления путем проверки данных в других полях.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. Используйте этот шаблон для создания вторичных индексов на основе наборов данных для хранилищ данных, которые не поддерживают собственные вторичные индексы.Use to create secondary indexes over data sets for data stores that don't support native secondary indexes.