[Перевод] Два подхода моделирования исторических данных

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

a8a56478c0d5543a6830e4c033af4b0d.png


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

37716e643c7482f1e0837158d2350d25.png


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

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

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

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

Таблица «MedicalRecords»

Таблица «MedicalRecords»

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

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

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

Таблица «MedicalRecordsHistory»

Таблица «MedicalRecordsHistory»

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

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

© Habrahabr.ru