Za każdym razem, gdy potrzebuję zaprojektować nową bazę danych, spędzam trochę czasu zastanawiając się, jak skonfigurować schemat bazy danych, aby prowadzić dziennik audytu zmian.
Zadano już tutaj kilka pytań na ten temat, ale nie zgadzam się, że istnieje jedno najlepsze podejście do wszystkich scenariuszy:
- Projekt bazy danych dla zmian
- Najlepszy projekt tabeli bazy danych inspekcji dziennika zmian
- Pomysły na projekt bazy danych do przechwytywania ścieżek audytu
Natknąłem się również na ten interesujący artykuł o utrzymywaniu dziennika zmian w bazie danych, w którym próbuję wymienić zalety i wady każdego podejścia. Jest bardzo dobrze napisany i zawiera ciekawe informacje, ale jeszcze bardziej utrudnia mi to podjęcie decyzji.
Moje pytanie brzmi: czy istnieje odniesienie, którego mogę użyć, może książka lub coś w rodzaju drzewa decyzyjnego, do którego mogę się odwołać, aby zdecydować, w którą stronę powinienem pójść, na podstawie pewnych zmiennych wejściowych, takich jak:
- Dojrzałość schematu bazy danych
- Sposób odpytywania dzienników
- Prawdopodobieństwo, że trzeba będzie odtworzyć rekordy
- Co ważniejsze: wydajność zapisu lub odczytu
- Charakter rejestrowanych wartości (ciąg, liczby, obiekty blob)
- Dostępna przestrzeń do przechowywania
Znane mi podejścia to:
1. Dodaj kolumny dla daty utworzenia i modyfikacji oraz użytkownika
Przykład tabeli:
- ID
- wartość_1
- wartość_2
- wartość_3
- stworz Date
- zmieniona data
- stworzone przez
- modyfikowane przez
Główne wady: tracimy historię modyfikacji. Nie można wycofać zmian po zatwierdzeniu.
2. Wstaw tylko tabele
- ID
- wartość_1
- wartość_2
- wartość_3
- z
- do
- usunięte (Boolean)
- użytkownik
Główne wady: Jak aktualizować klucze obce? Potrzeba ogromnej przestrzeni
3. Utwórz oddzielną tabelę historii dla każdej tabeli
Przykład tabeli historii:
- ID
- wartość_1
- wartość_2
- wartość_3
- wartość_4
- użytkownik
- usunięte (Boolean)
- znak czasu
Główne wady: Musi powielić wszystkie kontrolowane tabele. Jeśli schemat ulegnie zmianie, konieczna będzie również migracja wszystkich dzienników.
4. Utwórz skonsolidowaną tabelę historii dla wszystkich tabel
Przykład tabeli historii:
- Nazwa tabeli
- pole
- użytkownik
- Nowa wartość
- usunięte (Boolean)
- znak czasu
Główne wady: Czy będę w stanie łatwo odtworzyć rekordy (wycofać) w razie potrzeby? Kolumna nowa_wartość musi być ogromnym ciągiem, aby mogła obsługiwać wszystkie różne typy kolumn.