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

Некоторые логические сущности поддерживают версионирование — отслеживают изменения, внесенные в их данные.

Каждая версия данных — это набор изменений по одной операции записи, имеющий:

  • номер — равен номеру операции;
  • метку времени — равна моменту завершения операции (для операций вне дельты) или закрытия дельты (для операций в дельте).

Нумерация версий данных

Версии данных нумеруются в рамках логической БД — в микросекундах с 00:00:00 UTC 1 января 1970 года. Последовательность нумерации гарантируется только на уровне логической сущности, так как запись в разные логические таблицы и синхронизация разных материализованных представлений могут происходить параллельно.

Диапазон актуальности записи

Записи логической таблицы, снапшот-таблицы или материализованного представления с одинаковым первичным ключом считаются разными состояниями одного объекта.

Для каждой записи фиксируется диапазон ее актуальности:

  • начало — версия, когда запись появилась;
  • конец* — версия, после которой запись была обновлена или удалена.

* Для снапшот-таблиц конец диапазона актуальности записей фиксируется только при удалении записей из таблиц с включенным отслеживанием удалений.

Текущие и исторические записи

Добавленные записи называются текущими записями, пока они не обновлены и не удалены. Записи, которые перестали быть текущими из-за их обновления или удаления, но при этом остались храниться в сущности, называются историческими.

Текущие записи поддерживаются для всех сущностей, хранящих данных; исторические — только для сущностей, поддерживающих историю данных.

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

  • для логических таблиц:
    • при завершении операции записи — если операция выполнена вне дельты;
    • при закрытии дельты — если операция выполнена в дельте;
  • для материализованных представлений — при успешном завершении синхронизации.

Пример версионирования

На рисунке ниже показан пример нескольких версий данных. В версиях 1745030465002175 и 1745030465113976 изменения внесены в логическую таблицу stores, в версии 1745030465003246 — в другую таблицу.

Записи о магазине, добавленные в разных версиях

Версионирование на физическом уровне

Система хранит информацию о версионировании записей в служебных столбцах физических таблиц:

  • sys_from — версия, когда появилась запись;
  • sys_to — последняя версия, когда запись была текущей (NULL — если запись текущая);
  • sys_op — тип изменения (0 — добавление или обновление, 1 — удаление).

Эти столбцы по умолчанию скрыты на логическом уровне, но доступны для чтения при явном указании в запросе.