Перевод статьи с Medium
Уинстон Черчилль однажды сказал:
"Чем дальше вы сможете заглянуть в прошлое, тем дальше вы сможете видеть в будущее"
Он явно подчеркивал важность изучения и понимания истории для принятия более обоснованных решений в настоящем и выбирать правильный путь в будущее.
Исторические данные нужны в разных кейсах. Например:
Соответствовать требованиям нормативных актов;
Для анализа данных и отчетности;
Восстанавливаться после случайной потери данных или повреждения данных.
В этой статье автор расскажет про два подхода моделирования исторических данных:
Использование временных таблиц
Использование исторических таблиц
Временные таблицы
Прошлое и будущее реальны, а настоящее - мимолетный момент. Изучение всех трех необходимо для понимания мира.
Подход с временными таблицами работает путем добавления в каждую таблицу базы данных двух столбцов с датами. "Дата начала действия" и "Дата окончания действия".
Рассмотрим больницу, которая ведет учет записей пациентов со временем. База данных может содержать таблицу Медициескиз хаписей с атрибутами, такими как ID пациента, дата поступления, диагноз, и двумя временными колонками: "Дата начала действия" (“Effective From Date”) и "Дата окончания действия" (“Effective To Date”). Эти колонки будут определять диапазон дат записей пациента. Каждый раз, когда медицинская запись пациента обновляется, новая запись добавляется в таблицу МедицинскиеЗаписи с обновленной информацией и текущей датой в колонке "Дата начала действия".
Колонка "Дата окончания действия" остается пустой для новой записи, указывая на то, что это текущая запись.
Предположим, что медицинская запись пациента снова обновляется. В этом случае в таблицу добавляется ещё одна новая запись с обновлённой информацией, текущая дата в столбце "Дата начала действия" (“Effective From Date”), и столбец "Дата окончания действия" (“Effective To Date”) предыдущей записи обновляется текущей датой.
Основным недостатком использования временных таблиц является их сложность в хранении истории, требующая глубоких знаний SQL для извлечения точной информации. В таком подходе разработчику необходимо задавать специальные условия для извлечения актуального ID и его связывания с другими таблицами.
Исторические таблицы
Еще один подход — использование исторических таблиц, где хранится только последняя запись в транзакционной таблице, а все старые записи перемещаются в отдельную историческую таблицу. В таком случае база данных будет содержать две таблицы: «MedicalRecords» и «MedicalRecordsHistory».
Первоначально «MedicalRecords» будет выглядеть следующим образом:
Таблица «MedicalRecordsHistory» будет пустой. После обновления медицинской карты пациента старая строка будет добавлена в «MedicalRecordsHistory», а новая запись будет сохранена в «MedicalRecords».
Основное преимущество использования исторических таблиц: производительность запросов для оценки исторических записей намного выше, поскольку она отделена от основной таблицы. Это также обеспечивает более четкий журнал изменений.
Однако есть и отрицательная сторона: при использовании исторических таблиц требуется больше места для хранения и, следовательно, больше расходов на обслуживание.