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.
źródło
Odpowiedzi:
Jedną z metod używanych na kilku platformach wiki jest oddzielenie danych identyfikacyjnych od kontrolowanej zawartości. Dodaje to złożoności, ale w końcu otrzymujesz ścieżkę audytu pełnych rekordów, a nie tylko list edytowanych pól, które następnie musisz zmiksować, aby dać użytkownikowi wyobrażenie o tym, jak wyglądał stary rekord.
Na przykład, gdybyś miał tabelę o nazwie Szanse sprzedaży do śledzenia umów sprzedaży, w rzeczywistości utworzyłbyś dwie oddzielne tabele:
Opportunities
Opportunities_Content (lub coś w tym rodzaju)
Szanse stół miałby informacje chcesz użyć, aby jednoznacznie identyfikować rekord i byłoby domu klucz podstawowy chcesz odniesienia dla swoich zagranicznych kluczowych relacji. Opportunities_Content tabela będzie posiadać wszystkie pola użytkownicy mogą zmieniać i dla którego chcesz zachować ślad rewizyjny. Każdy rekord w tabeli zawartości zawierałby własną PK oraz dane zmodyfikowane przez i data modyfikacji. Szanse tabela będzie zawierać odniesienie do obecnej wersji, jak również informacje o tym, kiedy główny rekord został pierwotnie stworzony i przez kogo.
Oto prosty przykład:
A zawartość:
Prawdopodobnie uczyniłbym PK tabeli zawartości kluczem wielokolumnowym z identyfikatora strony i wersji, pod warunkiem, że wersja byłaby typem tożsamości. Użyjesz kolumny Revision jako FK. Następnie wyciągasz skonsolidowany rekord, łącząc się w ten sposób:
Tam mogą być jakieś błędy ... to jest z głowy. Powinien jednak dać wyobrażenie o alternatywnym wzorze.
źródło
PageContent.PageID
to FK toPage.ID
iPage.CurrentRevision
FK toPageContent.Revision
? Czy ta zależność jest naprawdę okrężna?id, revision_id
; bardziej przypominał stół łączeniowy. To dla mnie trochę śmierdzące. Jaką ma to przewagę nad podejściem 3 w PO (tabela historii na tabelę poddaną audytowi)?Jeśli używasz SQL Server 2008, prawdopodobnie powinieneś rozważyć zmianę przechwytywania danych. Jest to nowość na rok 2008 i może zaoszczędzić znaczną ilość pracy.
źródło
Nie znam żadnego odniesienia, ale jestem pewien, że ktoś coś napisał.
Jeśli jednak celem jest po prostu rejestracja tego, co się wydarzyło - najbardziej typowe użycie dziennika audytu - dlaczego nie po prostu zachować wszystkiego:
Przypuszczalnie jest to utrzymywane przez spust.
źródło
Stworzymy małą przykładową bazę danych dla aplikacji do blogowania. Wymagane są dwie tabele:
blog
: przechowuje unikalny identyfikator posta, tytuł, treść i usuniętą flagę.audit
: przechowuje podstawowy zestaw zmian historycznych z identyfikatorem rekordu, identyfikatorem wpisu na blogu, typem zmiany (NOWA, EDYCJA lub USUŃ) oraz datą / godziną tej zmiany. Poniższy kod SQL tworzyblog
i indeksuje usuniętą kolumnę:Poniższy kod SQL tworzy
audit
tabelę. Wszystkie kolumny są indeksowane, a klucz obcy jest definiowany dla audit.blog_id, który odwołuje się do blog.id. Dlatego też, gdy fizycznie USUWAMY wpis na blogu, usuwana jest również jego pełna historia kontroli.źródło
Myślę, że nie ma to jak drzewo decyzyjne. Ponieważ niektóre zalety i wady (lub wymagania) nie są tak naprawdę policzalne. Jak na przykład mierzy się dojrzałość?
Po prostu wyrównaj wymagania biznesowe dotyczące rejestrowania audytu. Spróbuj przewidzieć, jak te wymagania mogą się zmienić w przyszłości i wygeneruj swoje wymagania techniczne. Teraz możesz porównać to z zaletami i wadami i wybrać odpowiednią / najlepszą opcję.
Zapewniamy, że nie ma znaczenia, jak zdecydujesz, zawsze znajdzie się ktoś, kto myśli, że podjąłeś złą decyzję. Jednak odrobiłeś pracę domową i uzasadniłeś swoją decyzję.
źródło