Кожен раз, коли мені потрібно створити нову базу даних, я витрачаю досить багато часу на роздуми над тим, як мені створити схему бази даних, щоб вести журнал аудиту змін.
Тут вже були задані деякі питання, але я не згоден, що існує найкращий підхід для всіх сценаріїв:
- Дизайн бази даних для змін
- Найкращий дизайн таблиці таблиць баз даних аудиту змін
- Ідеї щодо розробки баз даних для зйомки аудиторських треків
Я також натрапив на цю цікаву статтю про ведення журналу змін бази даних, яка намагається перелічити плюси та мінуси кожного підходу. Це дуже добре написано і має цікаву інформацію, але це зробило мої рішення ще важче.
Моє запитання: чи є посилання, яке я можу використати, можливо, книга чи щось на зразок дерева рішень, яке я можу посилати, щоб вирішити, яким шляхом слід піти на основі деяких вхідних змінних, наприклад:
- Зрілість схеми бази даних
- Як запитуватимуть журнали
- Ймовірність того, що знадобиться відтворити записи
- Що важливіше: виконання або запис читання
- Характер значень, що реєструються (рядок, числа, крапки)
- Вільне місце для зберігання
Мені відомі підходи:
1. Додайте стовпці для створених та змінених дат та користувачів
Приклад таблиці:
- ід
- значення_1
- значення_2
- значення_3
- created_date
- модифіковано_даними
- створено
- модифікований_by
Основні мінуси: Ми втрачаємо історію модифікацій. Неможливо відкатати після фіксації.
2. Вставте лише таблиці
- ід
- значення_1
- значення_2
- значення_3
- з
- до
- видалено (булева)
- користувач
Основні мінуси: Як оновлювати зовнішні ключі? Потрібно величезний простір
3. Створіть окрему таблицю історії для кожної таблиці
Приклад таблиці історії:
- ід
- значення_1
- значення_2
- значення_3
- значення_4
- користувач
- видалено (булева)
- мітка часу
Основні мінуси: Необхідно дублювати всі перевірені таблиці. Якщо схема зміниться, знадобиться і для переміщення всіх журналів.
4. Створіть зведену таблицю історії для всіх таблиць
Приклад таблиці історії:
- Таблиця_ім'я
- поле
- користувач
- new_value
- видалено (булева)
- мітка часу
Основні мінуси: Чи зможу я легко відтворити записи (відкат), якщо це потрібно? Стовпець new_value має бути величезним рядком, щоб він міг підтримувати всі різні типи стовпців.