Когда в блогах говорили об агрегатно-ориентированных моделях, там подчеркивались их преимущества. Если вы хотите получить доступ к заказам, полезно собрать все данные для заказа в одном агрегате, который может храниться и предоставлять доступ как отдельная единица. Однако агрегатная ориентация имеет и недостаток: что произойдет, если товаровед захочет узнать, как часто конкретный товар заказывался на протяжении последних недель? В этом случае агрегатная ориентация мешает, вынуждая вас прочитывать каждый заказ в базе данных, чтобы получить ответ на вопрос. Вы можете облегчить задачу, построив индекс товаров, но все равно агрегатная структура останется неудобной.
Преимущество реляционных баз данных заключается в том, что отсутствие у них агрегатной структуры обеспечивает разнообразный доступ к данным. Более того, они обеспечивают удобный механизм, позволяющий искать данные не так, как они хранятся. Этот механизм называется представлением. Представление напоминает реляционную таблицу (оно является отношением), но определяется путем вычислений по базовым таблицам. Когда вы обращаетесь к представлению, база данных вычисляет данные в этом представлении — это удобная форма инкапсуляции.
Представления обеспечивают механизм сокрытия от клиента источника данных. Клиент не знает, были ли данные вычислены или просто взяты из базы данных. Однако вычисление некоторых представлений является затратным. Для решения этой проблемы были изобретены материализованные представления (materialized views
), т.е. представления, вычисленные заранее и записанные в кеш-память диска. Материализованные представления эффективны при работе с часто считываемыми данными, но могут оказаться устаревшими
Несмотря на то что в базах данных NoSQL нет представлений, они могут иметь заранее вычисленные и кешированные запросы, к которым также применяется термин “материализованное представление”. Этот аспект имеет гораздо большее значение для агрегатно-ориентированных баз данных, чем для реляционных баз, поскольку большинство приложений работают с запросами, которые плохо согласуются с агрегатной структурой. (Часто базы данных NoSQL создают материализованные представления с помощью подхода “отображение-свертка” (map-reduce).
Существуют две основные стратегии создания материализованного представления. Первая стратегия называется интенсивным обновлением, в рамках которой материализованное представление обновляется одновременно с обновлением соответствующих ему данных. В этом случае добавление заказа будет сопровождаться обновлением агрегатов истории покупок для каждого товара. Этот подход хорош, когда материализованное представление читается чаще, чем записывается, и должно быть актуальным. Здесь удобно применить подход, основанный на использовании баз данных приложения, поскольку он облегчает синхронную модификацию данных в базе и материализованном представлении.
Если вы не хотите мириться с дополнительными затратами при каждом обновлении базы данных, то можете через регулярные промежутки времени выполнять пакет заданий, связанных с обновлением материализованных представлений. Вы должны правильно задать допустимый уровень устаревания материализованных представлений, исходя из конкретных условий.
Материализованные представления можно создать за пределами базы данных, считывая данные, вычисляя представление и возвращая его в базу данных. Обычно базы данных самостоятельно создают материализованные представления. В этом случае вы должны задать необходимые вычисления, а база данных выполнит их, когда потребуется, в соответствии с заданными параметрами конфигурации. Это особенно удобно при интенсивном обновлении представлений в рамках постепенного отображения-свертки.
Материализованные представления можно использовать в одном и том же агрегате. Документ заказа может содержать элемент, представляющий собой резюме заказа. Запрос к этому резюме не требует обращений ко всему документу заказа. В базах данных типа “семейство столбцов” для создания материализованных представлений используются разные семейства столбцов. Это позволяет обновлять материализованное представление в ходе одной и той же атомарной операции.