Użyj „wstawić tylko” bazy danych, jak opisany przez Shiraz Bhaji, ale można użyć prostszej techniki. Dla każdej tabeli, dla której potrzebujesz danych audytu, wystarczy mieć dodatkową kolumnę dla Aktualizowanego czasu, domyślną dla teraz. Po wprowadzeniu zmiany w rekordzie, zamiast aktualizowania, po prostu zrób wstawkę ze wszystkimi danymi; kolumna updatedTime otrzyma aktualny czas.
Należy pamiętać, że ta metoda oznacza, że należy złamać lub ponownie rozważyć ograniczenia UNIQUE; możesz zachować klucz podstawowy, ale wyjątkowość staje się połączeniem Twojego klucza podstawowego i aktualizacji.
Ta technika ma tę zaletę, że daje znany zakres danych historycznych dla każdego rekordu na stole (każdy rekord jest ważny przez określony czas, jeśli jest to NAJWYŻSZY 1 rekordów GDZIE TimeOfInterest> Czas aktualizacji ORDER BY updatedTime DESC) z niskim obciążeniem (tylko jedna kolumna na stole). Jest także całkiem podatny na konwersję z tabel nie używających tej metody, z prostą tablicą ALTER, aby dodać pojedynczą kolumnę (którą można konsekwentnie nazwać). Następnie wystarczy zmienić swoje ograniczenia UNIQUE, aby użyć złożonego z ich obecnych ograniczeń i kolumny Aktualizacja, a niektóre zapytania będą musiały zostać zmienione.
Zwróć także uwagę, że można rzeczywiście uniknąć konwersji wszystkich zapytań, jeśli utworzysz widok tabeli, która po prostu zwróci najnowszy wpis dla każdego z rekordów; kończy się to tablicą, która przezroczyście przechowuje dane historyczne, oraz widokiem, który wygląda jak zwykły stół bez zmiany dziennika.
czy to nie jest po prostu ogromna strata przestrzeni? – Kolten
Jeśli potrzebujesz danych, które robisz, jeśli potrzebujesz ścieżki audytu, nie marnujesz jej. – nos
Nie użyłbym kolumn z datami dla jakichkolwiek danych ID/wyszukiwania ani żadnych danych sekwencji. Data systemu może ulec zmianie z dowolnego powodu lub wiele operacji odbywających się w tym samym czasie z jedną wartością daty/czasu jest możliwe. Jeśli potrzebujesz uchwycić sekwencję w czasie, użyj znacznika czasu (gwarantowanego unikatowego) lub użyj długich liczb całkowitych lub użyj przewodników, ponieważ twój zbyt buduje łańcuch (ale tracisz czas jako element informacyjny - czytaj również odpowiedź poniżej ...) –