Wenn ich mit dem von Ihnen erwähnten Problem konfrontiert wäre, würde ich eine LOG-Tabelle wie folgt entwerfen:
EntityName
:(String) Entität, die manipuliert wird. (obligatorisch)ObjectId
:Entität, die manipuliert wird, Primärschlüssel.FieldName
:(String) Feldname der Entität.OldValue
:(String) Alter Wert des Entitätsfeldes.NewValue
:(String) Neuer Wert des Entitätsfeldes.UserCode
:Eindeutige Kennung des Anwendungsbenutzers. (obligatorisch)TransactionCode
:Jede Operation, die die Entitäten ändert, muss einen eindeutigen Transaktionscode (wie GUID) haben (obligatorisch).
Im Falle einer Aktualisierung einer Entität, die mehrere Felder ändert, ist diese Spalte der Schlüsselpunkt, um alle Änderungen zu verfolgen die Aktualisierung (Transaktion)ChangeDate
:Transaktionsdatum. (obligatorisch)FieldType
:Aufzählung oder Text, der den Feldtyp wie TEXT oder Double zeigt. (obligatorisch)
Mit diesem Ansatz
Jede Entität (Tabelle) kann nachverfolgt werden
Berichte sind lesbar
Nur Änderungen werden protokolliert.
Der Transaktionscode ist der Schlüsselpunkt, um Änderungen durch eine Person zu erkennen Aktion.
Übrigens
Store the changes in the entitychange table and then store the value
according to its datatype in entitychange_[bool|timestamp|double|string]
Wird nicht benötigt, in der einzelnen Tabelle haben Sie Änderungen und Datentypen
Use partitioning by HASH(entity_id)
Ich werde es vorziehen, nach ChangeDate zu partitionieren oder Sicherungstabellen für changeDate zu erstellen, die alt genug sind, um gesichert und aus der Haupt-LOG-Tabelle entfernt zu werden
Should I use another database system, maybe MongoDB?
Jede Datenbank hat ihre eigenen Vor- und Nachteile, Sie können das Design auf jedem RDBMS verwenden. Ein nützlicher Vergleich von dokumentenbasierten Datenbanken wie MongoDB finden Sie hier
hoffe hilfreich zu sein.