Si tuviera el problema que mencionó, diseñaría la tabla LOG como se muestra a continuación:
EntityName
:(String) Entidad que está siendo manipulada. (obligatorio)ObjectId
:Entidad que está siendo manipulada, clave principal.FieldName
:(String) Nombre del campo de entidad.OldValue
:(String) Valor antiguo del campo de entidad.NewValue
:(Cadena) Nuevo valor del campo de entidad.UserCode
:Identificador único del usuario de la aplicación. (obligatorio)TransactionCode
:Cualquier operación que cambie las entidades deberá tener un código de transacción único (como GUID) (obligatorio),
En caso de una actualización en una entidad que cambie varios campos, esta columna será el punto clave para rastrear todos los cambios en la actualización (transacción)ChangeDate
:Fecha de Transacción. (obligatorio)FieldType
:enumeración o texto que muestra el tipo de campo como TEXTO o Doble. (obligatorio)
Con este enfoque
Se podría rastrear cualquier entidad (tabla)
Los informes serán legibles
Solo se registrarán los cambios.
El código de transacción será el punto clave para detectar cambios por un solo acción.
Por cierto
Store the changes in the entitychange table and then store the value
according to its datatype in entitychange_[bool|timestamp|double|string]
No será necesario, en la tabla única tendrá cambios y tipos de datos
Use partitioning by HASH(entity_id)
Preferiré particionar por ChangeDate o crear tablas de respaldo para changeDate que sean lo suficientemente antiguas para ser respaldadas y eliminadas de la tabla LOG principal
Should I use another database system, maybe MongoDB?
Cualquier base de datos viene con sus propios problemas y desventajas, puede usar el diseño en cualquier RDBMS. Una comparación útil de bases de datos basadas en documentos como MongoDB podría encontrarse aquí
Espero ser útil.