Перейти к содержанию

Создание битемпорального представления

Битемпоральное представление хранит оба времени: когда что-то произошло и когда это было записано. Его можно читать по состоянию на дату или в том виде, в каком оно было записано на дату, и более поздняя поправка никогда не скрывает того, что было известно до неё.

Представление становится битемпоральным, когда вы сопоставляете три его столбца:

  • Бизнес-ключ: столбец или столбцы, которые обозначают одну и ту же запись во всех версиях, например transaction_id. Исправленный платёж остаётся тем же платежом, поэтому обе версии несут один ключ.
  • Время действия: столбец с датой, которую ваш бизнес присваивает записи, например когда её согласовали, провели или она вступила в силу.
  • Время записи: столбец с моментом, когда эту версию ввели или изменили, например updated_at.

Время записи в литературе о темпоральных базах данных называют временем транзакции, а в SQL:2011 системным временем; время действия в SQL:2011 называют временем приложения, или датой вступления в силу.

Три значения сопоставляют столбцы, которые уже есть в вашем источнике. Provisa сама решает, как хранить версии; режим хранения выбирать не нужно.

Три примера

Пример Время действия Время записи
Платёж на 100 за 3 окт. 5 окт. исправлен на 120. 3 окт., поправка его сохраняет. 3 окт. у первой версии; 5 окт. у поправки.
Полевое измерение, сделанное 3 окт. в 14:10, введено 6 окт. Опечатку в нём исправили 7 окт. 3 окт. 14:10, исправление его сохраняет. 6 окт.; исправление получает 7 окт.
Сделка проведена при исполнении, дата сделки 3 окт., в 10:02. 4 окт. её количество оказалось неверным и было исправлено. Дата сделки 3 окт., исправление её сохраняет. 3 окт. 10:02; исправление получает 4 окт.

Прочитанная так, как о ней сообщили 3 окт., сделка показывает неверное количество. Прочитанная по тому, что известно сейчас, она показывает исправленное.

Создание представления

Представление с историей материализовано, чтобы его версии хранились.

  1. Откройте Views и нажмите + View.
  2. Определите представление на любой из двух вкладок:
    • Metrics: задайте имя представления, выберите его домен, метрики и измерения и нажмите Continue.
    • SQL: откройте редактор SQL, напишите и выполните SELECT, нажмите + View в редакторе, задайте имя представления и нажмите Continue.
  3. Настройки представления открываются в тех же разделах, что и его редактор. В разделе Load and timeliness отметьте Materialized View. Появится раздел Time Travel.
  4. Установите Keep history в Bitemporal.
  5. Выберите столбцы Business key, Valid time и Recorded time.
  6. Задайте остальное в других разделах и нажмите Save. До этого ничего не регистрируется.

Все три объявляются вместе или не объявляются вовсе. Provisa отклоняет представление, где названы только некоторые из них, и сообщает, каких не хватает.

Таблица получает те же разделы при регистрации: выберите её в + Table, нажмите Continue, и её раздел Time Travel находится в Load and timeliness. Модель получает этот раздел при создании (+ Model). У модели её ключ и есть бизнес-ключ, поэтому раздел спрашивает только два времени.

Таблица, обновляемая на месте

Одни таблицы хранят каждую версию отдельной строкой, так что исправление добавляет строку с тем же бизнес-ключом. Другие держат одну строку на ключ и перезаписывают её, поэтому их бизнес-ключ совпадает с первичным ключом. Для таблицы второго вида Provisa сам ведёт версии в журнале версий:

  • Каждый захват читает строки, записанные после последнего времени записи, которое есть в журнале, и добавляет изменившиеся.
  • Допустимое опоздание журнала расширяет это окно, так что строка, зафиксированная с опозданием и с более ранним временем записи, всё равно будет прочитана.
  • Захват не видит строку, которую источник удалил. Full capture заново читает всю таблицу и отмечает каждую удалённую строку как исчезнувшую.
  • Журнал начинается с первого захвата: до него у каждой строки есть только та версия, что была тогда.

Журнал показан в разделе Cache на вкладке Materialized Store как Version log of таблицы. Его Settings задают, как часто выполняется захват и каково допустимое опоздание; рядом — Full capture. Обычное чтение таблицы читает саму таблицу; чтение на момент времени или в том виде, как было записано на момент времени, читает её журнал.

Чтение

Представление появляется в списке Views со значком HISTORY. Его панель сведений сообщает, что оно хранит историю, и ведёт в обозреватель SQL с выбранным представлением. Установите в обозревателе поля As of и As recorded at на нужные моменты и выполните запрос.

Те же времена доходят до всех остальных интерфейсов. Сеанс pgwire задаёт их один раз для каждого выполняемого оператора:

SET provisa.as_of = '2026-10-03T12:00:00';
SET provisa.as_recorded = '2026-10-03T23:59:59';

Заголовки HTTP, аргументы resolve и параметры REST перечислены в разделе Представления с историей.

Изменение позже

Редактор показывает раздел Time Travel на вкладке Load and timeliness представления. Как только представление построено, его версии записаны под его бизнес-ключом и временем действия, поэтому редактор больше не предлагает их, как и переключатель, выключающий Time Travel. Время записи по-прежнему можно изменить. Чтобы вести историю по другому ключу, создайте новое представление.