Каждый раз, когда мне нужно спроектировать новую базу данных, я трачу довольно много времени на размышления о том, как мне настроить схему базы данных, чтобы вести журнал аудита изменений.
Здесь уже задавались некоторые вопросы по этому поводу, но я не согласен с тем, что существует единый лучший подход для всех сценариев:
- Дизайн базы данных для ревизий
 - Лучший дизайн для таблицы базы данных аудита журнала изменений
 - Идеи по созданию базы данных для сбора контрольных записей
 
Я также наткнулся на эту интересную статью "Ведение журнала изменений базы данных", в которой попытался перечислить все "за" и "против" каждого подхода. Это очень хорошо написано и имеет интересную информацию, но это сделало мои решения еще сложнее.
Мой вопрос: есть ли ссылка, которую я могу использовать, может быть, книга или что-то вроде дерева решений, на которое я могу сослаться, чтобы решить, каким путем мне идти, основываясь на некоторых входных переменных, например:
- Зрелость схемы базы данных
 - Как будут запрашиваться журналы
 - Вероятность того, что будет необходимо воссоздать записи
 - Что важнее: написать или прочитать производительность
 - Природа значений, которые регистрируются (строка, числа, капли)
 - Доступное место для хранения
 
Подходы, которые я знаю:
1. Добавить столбцы для созданной и измененной даты и пользователя
Пример таблицы:
- Я бы
 - значение_1
 - значение_2
 - VALUE_3
 - Дата создания
 - MODIFIED_DATE
 - создано
 - модифицирован
 
Основные минусы: мы теряем историю модификаций. Не могу откатиться после коммита.
2. Вставьте только таблицы
- Я бы
 - значение_1
 - значение_2
 - VALUE_3
 - от
 - в
 - удалено (логическое)
 - пользователь
 
Основные минусы: как поддерживать актуальность внешних ключей? Нужно огромное пространство
3. Создайте отдельную таблицу истории для каждой таблицы
Пример таблицы истории:
- Я бы
 - значение_1
 - значение_2
 - VALUE_3
 - value_4
 - пользователь
 - удалено (логическое)
 - timestamp
 
Основные минусы: необходимо дублировать все проверенные таблицы. Если схема изменится, потребуется перенести и все журналы.
4. Создайте сводную таблицу истории для всех таблиц
Пример таблицы истории:
- table_name
 - поле
 - пользователь
 - new_value
 - удалено (логическое)
 - timestamp
 
Основные минусы: Смогу ли я легко воссоздать записи (откат), если это необходимо? Столбец new_value должен быть огромной строкой, чтобы он мог поддерживать все типы столбцов.