Версионирование данных
Все записи логической таблицы с одинаковым значением первичного ключа рассматриваются системой как исторические состояния одного объекта. Объект может одновременно иметь множество архивных состояний, а также не более одного актуального и не более одного нового («горячего») состояния.
Данные, добавленные в логическую таблицу с помощью функций загрузки и обновления данных, считаются новым состоянием объектов и сохраняются в виде горячих записей. При закрытии дельты и фиксации изменений система одномоментно обновляет состояние объектов, исключая чтение горячих данных.
Состояние данных обновляется в следующем порядке:
- По каждой горячей записи:
- Выполняется поиск соответствующей актуальной записи. Записи сопоставляются по значению первичного ключа.
- Если актуальная запись найдена, она становится архивной.
- Горячая запись становится актуальной, если содержит признак добавления, или удаляется, если содержит признак удаления.
- В историю изменений данных добавляется новая дельта с номером, равным номеру предыдущей дельты + 1.
Под признаком добавления или удаления записи понимается значение sys_op
(0 — добавление, 1 — удаление), если запись была загружена, и тип запроса (INSERT VALUES, INSERT SELECT и UPSERT VALUES — добавление, DELETE — удаление), если запись была обновлена.
Пример версионирования данных
Рассмотрим пример версионирования данных одного магазина. Представим, что какое-то время назад магазин переехал с адреса ул. Старая, 9
на ул. Новая, 11
, и это изменение было зафиксировано в логической таблице stores
. А теперь категория магазина поменялась с basic
на vip
, и эта информация загружена в горячей дельте.
Данные магазина обновляются в следующем порядке (см. рисунок ниже):
- При загрузке запись с новой категорией сохраняется как горячая запись.
- При закрытии дельты запись с предыдущей категорией становится архивной, а запись с новой категорией — актуальной. Обновление записей происходит одномоментно.
На рисунке ниже показаны версии записей до и после закрытия одной дельты. Актуальные версии записей помечены значком пользователя: именно их система по умолчанию возвращает на запрос внешней системы, если в запросе не указан момент времени, на который запрашиваются данные.