Открыть сервис

Temporal Tables

Temporal Tables (темпоральные таблицы) — это функциональность систем управления базами данных (СУБД), позволяющая автоматически хранить и обрабатывать историю изменений данных в таблице, обеспечивая возможность выполнения запросов к состоянию данных на любой момент времени в прошлом.

Темпоральные таблицы реализуют концепцию управления данными, основанную на времени (time-varying data). В отличие от обычных таблиц, которые хранят только текущее (актуальное) состояние записей, темпоральные таблицы сохраняют полную историю всех изменений: вставок, обновлений и удалений. Это позволяет решить задачи аудита, восстановления данных, анализа изменений, соответствия нормативным требованиям (например, GDPR или бухгалтерским стандартам) и построения отчётов, показывающих состояние объекта в заданный момент времени.

История и стандартизация

Концепция темпоральных баз данных разрабатывалась с 1970-х годов, однако массовое внедрение в промышленных СУБД началось лишь в 2010-х. Ключевой вехой стало включение поддержки темпоральных таблиц в стандарт SQL:2011 (ISO/IEC 9075:2011). Этот стандарт определил два типа временных измерений:

Первыми крупными СУБД, реализовавшими системно-временные таблицы (System-Versioned Temporal Tables), стали IBM DB2 (в версии 10.1, 2012) и Microsoft SQL Server (в версии 2016). Позднее поддержка была добавлена в Oracle (в версии 12.2, 2017, как Flashback Archive — временная таблица) и других системах. В 2022 году в рамках стандарта SQL:2023 были уточнены и расширены возможности темпоральных запросов.

Принцип работы

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

  1. Текущая (активная) таблица — хранит актуальное состояние данных.
  2. Историческая таблица — автоматически создаваемая системой таблица, в которую копируются старые версии строк при их изменении или удалении.

Управление временем транзакции (системное версионирование) в большинстве реализаций осуществляется автоматически на уровне СУБД. Для каждой строки автоматически добавляются два скрытых служебных столбца:

При выполнении операции UPDATE СУБД не модифицирует существующую строку, а:

  1. Копирует старую версию строки в историческую таблицу, устанавливая её SysEndTime равным текущему времени.
  2. Обновляет текущую строку в основной таблице, устанавливая её SysStartTime равным текущему времени.

При выполнении DELETE строка просто помечается в текущей таблице как удалённая (её SysEndTime фиксируется), и она перемещается в историю.

Пример реализации в Microsoft SQL Server

Создание системно-версионированной темпоральной таблицы:

``sql CREATE TABLE dbo.Employees ( EmployeeID INT PRIMARY KEY, Name NVARCHAR(100), Position NVARCHAR(100), Salary DECIMAL(10,2), -- Служебные столбцы, обязательные для темпоральной таблицы SysStartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL, SysEndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL, -- Указание периода для версионирования PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime) ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employees_History)); ``

Запрос для получения состояния данных на 1 января 2023 года:

``sql SELECT * FROM dbo.Employees FOR SYSTEM_TIME AS OF '2023-01-01T00:00:00'; ``

Типы темпоральных таблиц

Хотя стандарт SQL:2011 описывает оба измерения, на практике наибольшее распространение получили системно-версионированные таблицы (System-Versioned Temporal Tables). Выделяют следующие основные типы:

Преимущества и недостатки

Преимущества

Недостатки

Применение

Темпоральные таблицы активно используются в системах, где важна история изменений:

Критика

Основная критика в адрес темпоральных таблиц связана с тем, что их реализация в разных СУБД существенно отличается от стандарта SQL:2011. Каждая СУБД (Microsoft SQL Server, Oracle, IBM DB2, PostgreSQL через расширение pg_cron или через триггеры) имеет свой синтаксис и свои особенности, что затрудняет перенос приложений между системами. Кроме того, в некоторых СУБД (например, в MySQL) встроенная поддержка темпоральных таблиц до сих пор отсутствует, и разработчики вынуждены реализовывать аналогичную логику самостоятельно, что снижает надёжность и увеличивает время разработки.

Источники

  1. K. Kulkarni, J-E. Michels. Temporal features in SQL:2011. ACM SIGMOD Record, 2012. — Основополагающая статья, описывающая стандарт SQL:2011.
  2. Microsoft Docs. Temporal Tables (SQL Server). — Официальная документация.
  3. Oracle Help Center. Managing Temporal Validity and Flashback Data Archive. — Официальная документация.
  4. IBM Documentation. System-period temporal tables. — Официальная документация.
  5. C. J. Date, H. Darwen, N. Lorentzos. Temporal Data and the Relational Model. — Классическая монография по теории темпоральных баз данных.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →