Ein Beispiel für die einfache Versionierung von PostgreSQL-Datensätzen

Als ich die Implementierung der "Record History" - Versionierung sah, auf der Seite des Programms, das mit der SQL-Datenbank arbeitet. Vor dem Ändern des Datensatzes wurde die alte Version aus der Datenbank abgerufen, in XML geschrieben und die resultierende XML-Zeichenfolge in eine separate Versionstabelle geschrieben.

Anfangs plante er in seinem Programm, einige Zeit später eine Versionierung durchzuführen, keine dringende Notwendigkeit. Ich erinnere mich, dass es den Wunsch gab, den jsonb-Datentyp irgendwo zu verwenden, sobald ich an eine einfache und präzise Implementierung der Versionierung auf der SQL-Seite dachte, konnte ich dies nicht tun. Nur eine Versionstabelle mit 5 Spalten und einer Triggerfunktion in 3 Codezeilen.

Die Implementierung einer Versionstabelle zu beschreiben, reicht nicht aus, daher müssen Sie beispielsweise einige weitere Tabellen beschreiben.

In fast allen Datenbanken gibt es mit seltenen Ausnahmen eine Benutzertabelle - Benutzer. Es ist nützlich, den Änderungsverlauf zu speichern - Versionen des Benutzers, z. B. für die Möglichkeit, vom Benutzer selbst auf die alte Version zurückzusetzen.

Beispiel für eine Benutzertabelle:

Bild

Die letzten beiden Felder im Bild werden für die Versionstabelle benötigt. Sie können auch als "Autor der Version" und "Versionsdatum" bezeichnet werden. Auf Wunsch können Sie jedoch auch darauf verzichten.

Versionstabelle:



Triggerfunktion zum Speichern von Versionen:



Die ersten beiden Felder werden aus dem gespeicherten Datensatz OLD.changestamp und OLD.userid ausgefüllt.
In der Versionstabelle können nicht nur die Benutzertabelleneinträge gespeichert werden, das dritte Feld ist der MD5-Hash des Namens der versionierten Tabelle, der in uuid konvertiert wurde.

In den zuvor beschriebenen Beispielen wurde eine sehr einfache Struktur beschrieben, aber in der Regel können verschiedene Referenzdaten zusätzliche Tabellen mit einer Eins-zu-Viele-Beziehung aufweisen.

Zum Beispiel die Tabelle "Benutzergruppen".



Die zweite Tabelle lautet "Gruppenbenutzer". Die Zusammensetzung der Gruppe sind die Benutzer in der Gruppe.



Um den einfachen Versionsmechanismus nicht zu komplizieren, können Sie Daten in der Gruppentabelle leicht duplizieren und ein jsonb-Feld hinzufügen, das die Struktur der Tabelle "Gruppenbenutzer" wiederholt.



Um die Arbeit mit doppelten Daten zu vereinfachen, können Sie mit INSERT oder UPDATE eine zusätzliche Triggerfunktion erstellen, die die Tabelle "Group Users" aus dem Feld "jsonb" ausfüllt.



Die oben beschriebene Vervielfältigung ist nur erforderlich, wenn Daten häufig und so schnell wie möglich aus der Tabelle abgerufen werden müssen. Wenn beispielsweise häufig eine Abfrage an die Tabelle "Gruppenbenutzer" gesendet wird, um festzustellen, ob ein Benutzer Mitglied der Gruppe "Administratoren" ist. In anderen Fällen können Daten durch Abfrage direkt aus dem Feld jsonb abgerufen werden, ohne dass eine doppelte Tabelle verwendet wird.

Der vollständige Beispielcode ist hier

Source: https://habr.com/ru/post/de423399/


All Articles