Мы планируем внедрить в нашу базу данных простой Audit Trail, используя триггеры и отдельную таблицу истории для каждой таблицы, для которой требуется аудит.
Например, рассмотрим таблицу 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
)
Мне кажется, это немного странно.Я согласен с @ комментарием Джонатана Леффлера , что запись аудита не должна останавливать удаление родительских данных.Вместо этого, если это требуется, его следует обрабатывать с помощью внешних ключей в основной таблице, а не в таблице аудита.Я хочу узнать ваше мнение, чтобы убедиться, что я не упускаю некоторую ценность в расширении внешних ключей для таблиц аудита.
Теперь мой вопрос: Это хороший дизайн?иметь эти внешние ключи в таблицах истории?
Любая информация о ключевых аргументах (бывшая производительность, лучшие практики, гибкость проектирования и т. д.) будет высоко оценена.
Для пользы любого, кто ищетдля конкретной цели и нашей среды:
Цель:
- Ведение истории критических данных
- Разрешить аудит активности пользователей с поддержкой воссоздания сценария
- В ограниченной степени разрешить откат пользовательской активности
Среда:
- Транзакционная база данных
- Не для каждой таблицы требуется аудит
- Использованиемягкое удаление в максимально возможной степени, особенно для статических / справочных данных
- Немногие таблицы с высокой степенью транзакций используют жесткое удаление