Link Search Menu Expand Document

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

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

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

  • 0 — нужно добавить новую запись или обновить существующую, если такая будет найдена;
  • 1 — нужно удалить существующую запись.

Если поле sys_op отсутствует в схеме данных Avro и (или) в загружаемых записях, при попытке выполнить запрос INSERT INTO logical_table система вернет исключение.

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

  • Если актуальная запись есть и значение sys_op новой записи равно 0, актуальная запись перемещается в архив, а новая запись сохраняется в качестве актуальной.
  • Если актуальная запись есть и значение sys_op новой записи равно 1, актуальная запись перемещается в архив. Добавление новой записи не происходит, и среди актуальных записей не остается записей с этим первичным ключом.
  • Если актуальной записи нет, новая запись сохраняется в качестве актуальной.

Примечание: для удаления записи нужно, чтобы все данные новой записи (кроме значения sys_op) совпадали с данными одной из актуальных записей логической таблицы. Если первичные ключи актуальной и новой записи совпадают, но другие данные этих записей различаются, выдается исключение и запись не удаляется.