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