Zapamiętywanie historii zmian w bazie.

0

Mam pytanie odnośnie propozycji rozwiązania zapamiętywania wszystkich zmian w tabeli. Otóż mam przykładową tabelę 'X' i zrobionego do niego CRUD. Zależy mi na tym, żeby stworzyć osobny widok, który będzie wyświetlał wszystkie historie updateów. Np. data i treść poprzedniej wersji. Macie jakieś pomysły jak to zrobić? Osobna tabela w bazie i relacja jeden do wiele? Być może istnieje już jakiś gem do tego?
Z góry dzięki za sugestie.

2

W poprzedniej firmie gdzie pracowałem był zrobiony tzw mechanizm "cieni". Na bazie danych (oracle) utworzony był oddzielny schemat, który miał idealną kopię tabel ze schematu produkcyjnego + kilka dodatkowych kolumna w każdej tabeli jak np czas, typ operacji, operator, sesja, a niekiedy nawet call_stack. Na schemacie produkcyjnym na każdej tabeli były triggery after insert/update/delete, które robiły tylko i wyłącznie insert do schematu "cieni". Całkiem przyjemny mechanizm tyle, że strasznie dysko-żerny. Osobny schemat był stworzony po to aby można było wygodnie to partycjonować i nie obciążać bazy produkcyjnej.

2

Ja bym zrobił to w ten sposób, że utworzyłbym oddzielną tabelę np:
tabela X -> X_historia
Miała by te same pola co tabela podstawowa oraz jedno dodatkowe WERSJA. Triggerami można by przepisywać wszelkie zmiany jako nowy rekord do tabeli historycznej. Dodatkowo jeszcze warto trzymać w tabelach odnoszących się do danej tabeli wersję rekordu. Wtedy widać jak wyglądał dokument przez naniesieniem poprawek.

1

U nas w projekcie mamy to rozwiązane przez dodanie w tabeli oprócz zwykłego bazodanowego Id również ObjectId i ObjectHistId, w których jest ta sama wartość, Przy update dodawany jest nowy wpis, do którego przenoszone jest ObjectId (w poprzednim ustawiane na null) i oba wpisy mają to samo ObjectHistId (przez co wiadomo, że to ten sam rekord tylko zaktualizowany). Do tego zapisujemy id transakcji tworzącej (kopiowana po update do kolejnych wierszy tak samo jak ObjectHistId) i id transakcji która robiła update. Transakcje z info o dacie i userze są w osobnej tabeli. Dane pobieramy przez ObjectId zamiast przez Id. Chcąc pobrać wszystkie wersje wystarczy zrobić zapytanie z warunkiem ObjectHistId == ObjectId.

Nie wiem na ile to optymalne i wygodne, ale taki projekt powstał to jest, nie ja byłem architektem :P

1

Coś z tej listy rozwiąże twój problem: https://www.ruby-toolbox.com/categories/Active_Record_Versioning

Osobiście używałem tylko PaperTrail i Audited.

1 użytkowników online, w tym zalogowanych: 0, gości: 1