Link Search Menu Expand Document

Версионирование данных

Все записи логической таблицы с одинаковым значением первичного ключа рассматриваются системой как исторические состояния одного объекта. Объект может одновременно иметь множество архивных состояний, а также не более одного актуального и не более одного нового («горячего») состояния.

Данные, добавленные в логическую таблицу с помощью функций загрузки и обновления данных, считаются новым состоянием объектов и сохраняются в виде горячих записей. При закрытии дельты и фиксации изменений система одномоментно обновляет состояние объектов, исключая чтение горячих данных.

Состояние данных обновляется в следующем порядке:

  1. По каждой горячей записи:
    1. Выполняется поиск соответствующей актуальной записи. Записи сопоставляются по значению первичного ключа.
    2. Если актуальная запись найдена, она становится архивной.
    3. Горячая запись становится актуальной, если содержит признак добавления, или удаляется, если содержит признак удаления.
  2. В историю изменений данных добавляется новая дельта с номером, равным номеру предыдущей дельты + 1.

Под признаком добавления или удаления записи понимается значение sys_op (0 — добавление, 1 — удаление), если запись была загружена, и тип запроса (INSERT VALUES, INSERT SELECT и UPSERT VALUES — добавление, DELETE — удаление), если запись была обновлена.

Пример версионирования данных

Рассмотрим пример версионирования данных одного магазина. Представим, что какое-то время назад магазин переехал с адреса ул. Старая, 9 на ул. Новая, 11, и это изменение было зафиксировано в логической таблице stores. А теперь категория магазина поменялась с basic на vip, и эта информация загружена в горячей дельте.

Данные магазина обновляются в следующем порядке (см. рисунок ниже):

  1. При загрузке запись с новой категорией сохраняется как горячая запись.
  2. При закрытии дельты запись с предыдущей категорией становится архивной, а запись с новой категорией — актуальной. Обновление записей происходит одномоментно.

На рисунке ниже показаны версии записей до и после закрытия одной дельты. Актуальные версии записей помечены значком пользователя: именно их система по умолчанию возвращает на запрос внешней системы, если в запросе не указан момент времени, на который запрашиваются данные.

Обновление данных магазина