Мы планируем ввести простой контрольный журнал в нашу базу данных с использованием триггеров и отдельной таблицы истории для каждой таблицы, требующей аудита.
Например, рассмотрим таблицу 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, чтобы поддерживать ссылочную целостность. Аргумент, сделанный в пользу этого, заключался в том, что мы всегда в основном выполняем мягкий (логический логический флаг) delete, а не hard delete, его хорошо поддерживать ссылочную целостность, чтобы убедиться, что у нас нет никаких сиротских идентификаторов в таблице аудита.
Table StudentScoreHistory (
StudentScoreHistoryID, -- PK
StudentScoreID,
StudentID ref Student(StudentID), -- FK to Student
CourseID ref Course(CourseID), -- FK to Course
AuditActionCode,
AuditDateTime,
AuditActionUserID
)
Кажется, это немного странный дизайн для меня. Я согласен с комментарием @Jonathan Leffler, что запись аудита не должна останавливать удаление родительских данных. Вместо этого, если это необходимо, следует обрабатывать через внешние ключи в основной таблице, а не в таблице аудита. Я хочу получить ваше мнение, чтобы убедиться, что я не пропускаю некоторую ценность при распространении внешних ключей на таблицы аудита.
Теперь мой вопрос: Хороший дизайн для этих внешних ключей в таблицах истории?
Любые подробные сведения о ключевых аргументах (производительность, наилучшая практика, гибкость дизайна и т.д.) будут высоко оценены.
В интересах любого, кто ищет определенную цель и нашу среду:
Цель:
- Сохранение истории критических данных
- Разрешить аудит активности пользователя с поддержкой воссоздания сценария
- В ограниченной степени разрешить откат активности пользователя.
Окружающая среда:
- База транзакций
- Не каждая таблица требует аудита
- Использует soft-delete, насколько это возможно, специально для статических/справочных данных
- Немногие транзакционные таблицы используют жесткие удаления