Jakie są sposoby, aby umożliwić wersjonowanie wpisów do bazy danych (danych)?
Pomyśl o zdolności systemów zarządzania treścią do cofania zmian artykułów.
Jakie są ich zalety / wady?
Jakie są sposoby, aby umożliwić wersjonowanie wpisów do bazy danych (danych)?
Pomyśl o zdolności systemów zarządzania treścią do cofania zmian artykułów.
Jakie są ich zalety / wady?
Odpowiedzi:
Istnieją w zasadzie dwa podejścia: tabela audytu, w której zapisane są wszystkie poprzednie wartości, lub zawierają datę rozpoczęcia / zakończenia jako część tabeli, a wszystkie aktualizacje tworzą nowy rekord podczas zamykania starego.
Aktualizacja: SQL SERVER 2016 obsługuje to jako wzorzec projektowy / typ tabeli - https://docs.microsoft.com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-2017
Jednym z pomysłów jest użycie „baz danych tylko do wstawiania”. Podstawową ideą jest to, że nigdy nie usuwasz ani nie aktualizujesz danych w wierszu .
Każda tabela wymagająca śledzenia będzie miała dwie datetime
kolumny from
i to
. Zaczynają się od wartości NULL
w każdym (od początku do końca czasu). Gdy potrzebujesz „zmienić” wiersz, dodajesz nowy wiersz, a jednocześnie aktualizujesz to
w poprzednim wierszu Now
i from
w wierszu, do którego dodajesz Now
.
Aby uzyskać bardziej szczegółowe informacje, zobacz:
Ta technika nazywa się AuditTrail
do zarządzania starszymi danymi, a jej sklepy zmieniają historię.
Wygląda na to, że pytanie tego rodzaju jest już opublikowane:
Myślę, że możesz używać wyzwalaczy dla każdej tabeli i utrzymywać dane w _history (lub możesz podać dowolną nazwę), a przy każdej wstawce, aktualizacja, usuwanie w głównej tabeli wyzwoli wyzwalacz i możesz zapisać szczegóły w tej tabeli. jest również dostępny z bazą danych SQLite, jeśli go używasz.
Ten mechanizm jest przydatny również w przypadku dużych projektów. W tej tabeli możesz zapisać informacje o użytkowniku, który dokonał zmian wraz ze znacznikiem czasu zmian. następnie możesz przywrócić tabelę do dowolnego znacznika czasu odpowiadającego Twoim wymaganiom.
Każda baza danych ma swój własny sposób pisania i wyzwalania kodu. Jeśli używasz SQLite, odwiedź SQLite.org, aby uzyskać składnię. W przypadku innych baz danych możesz odwiedzić ich oficjalne strony.
Prawdopodobnie znasz silnik db Sqlite . Cały plik db jest zapisany w jednym pliku. Interfejs API obsługuje również wirtualne systemy plików, więc zasadniczo możesz organizować pamięć w dowolnym miejscu i dowolnym formacie, po prostu odpowiadać na operacje odczytu i zapisu przy określonych przesunięciach plików. Możliwe do tego zastosowania mogą być szyfrowanie, kompresja i tak dalej. Najlepsze jest to, że warstwa kontenerowa nie powinna wiedzieć nic o bazach danych, formacie pliku sql lub sqlite, wystarczy stosować się do wywołań zwrotnych xRead i xWrite.
Jednym z pomysłów było wdrożenie funkcji maszyny czasu. Tak więc każda operacja xWrite zapisuje każdy segment, który zastąpiłby w historii „cofania”, a użytkownik może wybrać datę w przeszłości, aby zobaczyć, co zawiera db (prawdopodobnie tryb tylko do odczytu). Nie mam jeszcze działającego przykładu (była dyskusja na ten temat na liście mailowej sqlite), ale prawdopodobnie inne silniki dostarczają API VFS, więc możliwe jest coś podobnego. Po wdrożeniu powinien być kompatybilny ze strukturami baz danych o dowolnej złożoności.
Metodą używaną do wersjonowania wpisów w bazie danych jest użycie tabeli kontroli. Tabela ma schemat podobny do:
Seq - Int ' Unique identifier for this table
Event - Char ' Insert / Update / Delete
TblName - Char ' Table that had field value changed
FldName - Char ' Field that was changed
KeyValue - Char ' delimited list of values for fields that make up the PK of table changed
UsrId - Char ' User who made the change
OldValue - Char ' Old value (converted to character)
NewValue - Char ' New value (converted to character)
AddTs - DateTime ' When the change was made
Następnie mamy wyzwalacze przy wstawianiu / aktualizowaniu / usuwaniu tabel, które chcemy śledzić.
Plusy:
Cons:
Robię teraz wersję tego. dla każdego rekordu mam wstawioną datę, datę modyfikacji i flagę logiczną rekordu aktywnego. Dla początkowej wstawki Wstawione i zmodyfikowane daty są ustawione na Now () (w tym przykładzie jest Access), a flaga Rekord aktywny jest ustawiona na true
. następnie jeśli zmodyfikuję ten rekord, skopiuję całość do nowego rekordu, zmieniając pole (pola), które zmienia użytkownik, pozostawiam wstawioną datę równą oryginałowi i zmieniam Zmodyfikowaną datę na Now (). Następnie odwracam flagę Aktywnego rekordu oryginalnego rekordu do false
i nowego rekordu do true
. Mam również pole dla ModifiedRecordsParentID, w którym zapisuję tożsamość oryginalnego rekordu.
Jeśli nawet będę musiał zapytać, mogę po prostu zwrócić rekordy ActiveRecord = true
i uzyskać tylko najbardziej aktualne informacje.
ActiveRecord
flagi. Wiersz MAX (*) powinien zawsze być bieżącym rekordem. Przywracanie do poprzedniej wersji po prostu wstawia wspomniany wiersz do tabeli.
select top 1 order by id descending
.
Ponadto, jeśli chcesz przechowywać WSZYSTKIE zmiany w bazie danych w czasie, możesz sprawdzić rejestrowanie ( /programming/3394132/where-can-i-find-the-mysql-transaction-log )