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