Мы планируем ввести в нашу базу данных простой журнал аудита с использованием триггеров и отдельной таблицы истории для каждой таблицы, требующей аудита.
Например, рассмотрим таблицу StudentScore, у нее есть несколько внешних ключей (например, StudentID, CourseID), связывающих ее с соответствующими родительскими таблицами (Student и Course).
Table StudentScore (
StudentScoreID, -- PK
StudentID ref Student(StudentID), -- FK to Student
CourseID ref Course(CourseID), -- FK to Course
)
Если StudentScore требует аудита, мы планируем создать таблицу аудита StudentScoreHistory -
Table StudentScoreHistory (
StudentScoreHistoryID, -- PK
StudentScoreID,
StudentID,
CourseID,
AuditActionCode,
AuditDateTime,
AuditActionUserID
)
Если какая-либо строка в StudentScore будет изменена, мы переместим старую строку в StudentScoreHistory.
Один из вопросов, поднятых во время обсуждения дизайна, заключался в том, чтобы сделать StudentID и CourseID в таблице StudentHistory FK, чтобы сохранить ссылочную целостность. Аргумент, сделанный в пользу этого, заключался в том, что мы всегда в основном выполняем мягкое (логический логический флаг) удаление, а не жесткое удаление, это хорошо для поддержания ссылочной целостности, чтобы гарантировать, что у нас нет никаких сиротских идентификаторов в таблице аудита. .
Table StudentScoreHistory (
StudentScoreHistoryID, -- PK
StudentScoreID,
StudentID ref Student(StudentID), -- FK to Student
CourseID ref Course(CourseID), -- FK to Course
AuditActionCode,
AuditDateTime,
AuditActionUserID
)
Мне это кажется немного странным. Я согласен с комментарием @Jonathan Leffler, что запись аудита не должна останавливать удаление родительских данных. Вместо этого, если это необходимо, следует обрабатывать внешние ключи в основной таблице, а не в таблице аудита. Я хочу узнать ваше мнение, чтобы убедиться, что я не упускаю какую-то ценность в расширении внешних ключей для таблиц аудита.
Теперь мой вопрос: Хорошо ли иметь эти внешние ключи в таблицах истории?
Любые подробности по ключевым аргументам (например, производительность, передовой опыт, гибкость дизайна и т. Д.) Были бы весьма признательны.
Для всех, кто ищет конкретную цель и нашу среду:
Цель:
- Вести историю критических данных
- Разрешить аудит активности пользователей с поддержкой воссоздания сценария
- В ограниченной степени разрешить откат активности пользователей
Окружающая обстановка:
- Транзакционная база данных
- Не каждая таблица требует аудита
- По возможности использует мягкое удаление, особенно для статических / справочных данных
- Некоторые таблицы с высокой степенью транзакций используют жесткое удаление