Версионирование данных
Все записи логической таблицы с одинаковым первичным ключом рассматриваются системой как исторические состояния одного и того же объекта. Одновременно объект системы может иметь множество архивных состояний, а также не более одного актуального и не более одного нового (“горячего”) состояния.
Записи, загружаемые в логическую таблицу в рамках одной дельты, должны иметь уникальный первичный ключ. Для того чтобы система могла корректно определить, что делать с загруженными записями, каждая из них должна содержать значение sys_op
. Поле sys_op
является служебным и может принимать следующие значения:
- 0 — нужно добавить новую запись или обновить существующую, если такая будет найдена;
- 1 — нужно удалить существующую запись.
Если поле sys_op
отсутствует в схеме данных Avro и (или) в загружаемых записях, при попытке выполнить запрос INSERT INTO logical_table система вернет исключение.
Все загружаемые данные сохраняются в виде горячих записей, и затем, при фиксации изменений, система обновляет состояние объектов логических таблиц в соответствии с новыми данными. Порядок применения каждой из новых записей зависит от наличия/отсутствия актуальной записи с таким же первичным ключом и значения sys_op
новой записи:
- Если актуальная запись есть и значение
sys_op
новой записи равно 0, актуальная запись перемещается в архив, а новая запись сохраняется в качестве актуальной. - Если актуальная запись есть и значение
sys_op
новой записи равно 1, актуальная запись перемещается в архив. Добавление новой записи не происходит, и среди актуальных записей не остается записей с этим первичным ключом. - Если актуальной записи нет, новая запись сохраняется в качестве актуальной.
Примечание: для удаления записи нужно, чтобы все данные новой записи (кроме значения sys_op
) совпадали с данными одной из актуальных записей логической таблицы. Если первичные ключи актуальной и новой записи совпадают, но другие данные этих записей различаются, выдается исключение и запись не удаляется.