Перевод статьи с Medium


Уинстон Черчилль однажды сказал:

"Чем дальше вы сможете заглянуть в прошлое, тем дальше вы сможете видеть в будущее"

Он явно подчеркивал важность изучения и понимания истории для принятия более обоснованных решений в настоящем и выбирать правильный путь в будущее.

Исторические данные нужны в разных кейсах. Например:

  • Соответствовать требованиям нормативных актов;

  • Для анализа данных и отчетности;

  • Восстанавливаться после случайной потери данных или повреждения данных.

В этой статье автор расскажет про два подхода моделирования исторических данных:

  1. Использование временных таблиц

  2. Использование исторических таблиц

Временные таблицы

Прошлое и будущее реальны, а настоящее - мимолетный момент. Изучение всех трех необходимо для понимания мира.

Подход с временными таблицами работает путем добавления в каждую таблицу базы данных двух столбцов с датами. "Дата начала действия" и "Дата окончания действия".

Рассмотрим больницу, которая ведет учет записей пациентов со временем. База данных может содержать таблицу Медициескиз хаписей с атрибутами, такими как ID пациента, дата поступления, диагноз, и двумя временными колонками: "Дата начала действия" (“Effective From Date”) и "Дата окончания действия" (“Effective To Date”). Эти колонки будут определять диапазон дат записей пациента. Каждый раз, когда медицинская запись пациента обновляется, новая запись добавляется в таблицу МедицинскиеЗаписи с обновленной информацией и текущей датой в колонке "Дата начала действия".

Колонка "Дата окончания действия" остается пустой для новой записи, указывая на то, что это текущая запись.


Предположим, что медицинская запись пациента снова обновляется. В этом случае в таблицу добавляется ещё одна новая запись с обновлённой информацией, текущая дата в столбце "Дата начала действия" (“Effective From Date”), и столбец "Дата окончания действия" (“Effective To Date”) предыдущей записи обновляется текущей датой.


Основным недостатком использования временных таблиц является их сложность в хранении истории, требующая глубоких знаний SQL для извлечения точной информации. В таком подходе разработчику необходимо задавать специальные условия для извлечения актуального ID и его связывания с другими таблицами.

Исторические таблицы

Еще один подход — использование исторических таблиц, где хранится только последняя запись в транзакционной таблице, а все старые записи перемещаются в отдельную историческую таблицу. В таком случае база данных будет содержать две таблицы: «MedicalRecords» и «MedicalRecordsHistory».

Первоначально «MedicalRecords» будет выглядеть следующим образом:

Таблица «MedicalRecords»
Таблица «MedicalRecords»

Таблица «MedicalRecordsHistory» будет пустой. После обновления медицинской карты пациента старая строка будет добавлена ​​в «MedicalRecordsHistory», а новая запись будет сохранена в «MedicalRecords».

Таблица «MedicalRecords» (обновление Date)
Таблица «MedicalRecords» (обновление Date)
Таблица «MedicalRecordsHistory»
Таблица «MedicalRecordsHistory»

Основное преимущество использования исторических таблиц: производительность запросов для оценки исторических записей намного выше, поскольку она отделена от основной таблицы. Это также обеспечивает более четкий журнал изменений.

Однако есть и отрицательная сторона: при использовании исторических таблиц требуется больше места для хранения и, следовательно, больше расходов на обслуживание.

Комментарии (2)


  1. ssmaslov
    18.03.2024 20:01

    Про производительность кто интересно ерунду написал, автор или переводчик? А так два этих вида для разных типовых запросов. Аместь еще хранение срезами на даты


  1. EvgenyVilkov
    18.03.2024 20:01

    Плохо переводить то в чем сам не разбираешься. Разбирался\лась бы в предмете оригинальнйо статьи цитривать ее бы не стал\ла