Этот вопрос связан со схемой, которая может быть найдена в одном из моих других вопросов здесь. В основном в моей базе данных я храню пользователей, местоположения, датчики, среди прочего, Все эти вещи редактируются в системе пользователями и удаляются.
Однако - когда элемент отредактирован или удален, мне нужно сохранить старые данные; Мне нужно уметь видеть, какие данные были перед изменением.
В базе данных также есть не редактируемые элементы, такие как "показания". На самом деле они больше похожи на журнал. Чтения регистрируются с датчиками, поскольку его считывание для конкретного датчика.
Если я создаю отчет о показаниях, я должен уметь видеть, какие атрибуты для местоположения или датчика были во время чтения.
В принципе, я должен иметь возможность восстанавливать данные в любой момент времени.
Теперь, я сделал это раньше и хорошо работал, добавив следующие столбцы в каждую редактируемую таблицу:
valid_from
valid_to
edited_by
Если valid_to = 9999-12-31 23:59:59, то это текущая запись. Если valid_to равно valid_from, то запись удаляется.
Однако мне никогда не нравились триггеры, которые мне нужно использовать для обеспечения согласованности внешнего ключа.
Я могу избежать триггеров, используя расширение для базы данных PostgreSQL. Это обеспечивает тип столбца, называемый "период", который позволяет хранить период времени между двумя датами, а затем позволяет выполнять ограничения CHECK для предотвращения периодов перекрытия. Это может быть ответ.
Мне интересно, если есть другой способ.
Я видел, как люди упоминают использование специальных исторических таблиц, но мне не очень нравится мысль о том, чтобы поддерживать 2 таблицы почти для каждой таблицы (хотя это все еще возможно).
Возможно, я мог бы сократить мою первоначальную реализацию, чтобы не потрудиться, проверяя согласованность записей, которые не являются "текущими", т.е. только для проверки ограничений на записи, где valid_to - 9999-12-31 23:59:59. В конце концов, люди, которые используют исторические таблицы, похоже, не имеют ограничений на эти таблицы (по той же причине вам понадобятся триггеры).
Есть ли у кого-нибудь мысли об этом?
PS - название также упоминает проверяемую базу данных. В предыдущей системе, о которой я упоминал, всегда есть поле edit_by. Это позволило отслеживать все изменения, чтобы мы всегда могли видеть, кто изменил запись. Не знаете, какая разница.
Спасибо.