2009-06-26 18 views

Odpowiedz

19

Użyj „Wstaw tylko Databases”

Podstawowym założeniem jest to, że nigdy nie zaktualizować lub usunąć dane.

Każda tabela ma 2 kolumny datetime od i na.

Oni zaczynają się wartość null w każdym (początek czasu do końca czasu)

Kiedy trzeba „zmiana” wiersz dodać nowy wiersz, w tym samym czasie można zaktualizować do w poprzednim wierszu do Now i z w wierszu, który dodajesz do Teraz.

Dane odczytane z tabeli są wyświetlane w widoku, w którym występuje wartość = to null.

Ta metoda umożliwia również wyświetlenie stanu bazy danych w dowolnym momencie.

EDIT

prostu do wyjaśnienia w odpowiedzi na komentarz: Sekwencja byłyby podane przez klucz podstawowy tabeli, które byłyby numer autoincrement.

+2

czy to nie jest po prostu ogromna strata przestrzeni? – Kolten

+15

Jeśli potrzebujesz danych, które robisz, jeśli potrzebujesz ścieżki audytu, nie marnujesz jej. – nos

+4

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 ...) –

10

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.

4

Całkowicie odmienne podejście to posiadanie tylko dziennika kontroli. Następnie używasz tego, aby zbudować najnowszą wersję swoich danych. Tworzysz "punkty kontrolne" okresowo lub używając buforowania, aby przyspieszyć to.

Istnieje prezentacja o tym, że ktoś użył tej techniki: http://www.infoq.com/presentations/greg-young-unshackle-qcon08. Dużą zaletą jest to, że skoro masz tylko dziennik kontroli, będziesz pewny, że twoja ścieżka audytu jest prawidłowa.

Nigdy nie próbowałem tego i wydaje się dość skomplikowane ... ale coś do przemyślenia.

15

[Późno po ale dodaje dwie techniki nie wspomniane już tutaj]

Czytanie dziennika transakcji - jeśli baza danych jest w trybie pełnego odzysku następnie zapisuje dziennika transakcji wiele przydatnych informacji, które mogą być wykorzystane aby zobaczyć historię każdego rzędu. Wadą jest to, że nie jest to domyślnie obsługiwane. Można spróbować użyć funkcji nieudokumentowanych DBCC dziennika lub fn_dblog lub trzeci narzędzia firm takich jak ApexSQL Log

Korzystanie Change Data Capture - Change data capture zasadzie robi to samo, jak wykazano powyżej, ale jest to bardziej opływowy i nieco łatwiejsza w użyciu. Niestety jest to dostępne tylko w wersji Enterprise.

Oba mogą rozwiązać problem aktualizacji i usunięcia, ponieważ tak naprawdę nie można zmienić zapisanego w dzienniku transakcji.

Powiązane problemy