Se eu estivesse enfrentando o problema que você mencionou, eu criaria a tabela LOG como abaixo:
EntityName
:(String) Entidade que está sendo manipulada.(obrigatório)ObjectId
:Entidade que está sendo manipulada, chave primária.FieldName
:(String) Nome do campo da entidade.OldValue
:(String) Valor antigo do campo de entidade.NewValue
:(String) Novo valor do campo de entidade.UserCode
:Identificador exclusivo do usuário do aplicativo. (obrigatório)TransactionCode
:Qualquer operação que altere as entidades precisará ter um código de transação exclusivo (como GUID) (obrigatório),
No caso de uma atualização em uma entidade alterando vários campos, essas colunas serão o ponto chave para rastrear todas as alterações em a atualização (transação)ChangeDate
:Data da transação. (obrigatório)FieldType
:enumeração ou texto mostrando o tipo de campo como TEXT ou Double. (obrigatório)
Tendo esta abordagem
Qualquer entidade (tabela) pode ser rastreada
Os relatórios serão legíveis
Somente as alterações serão registradas.
O código de transação será o ponto chave para detectar alterações por um único ação.
BTW
Store the changes in the entitychange table and then store the value
according to its datatype in entitychange_[bool|timestamp|double|string]
Não será necessário, na tabela única você terá alterações e tipos de dados
Use partitioning by HASH(entity_id)
Prefiro particionar por ChangeDate ou criar tabelas de backup para changeDate com idade suficiente para fazer backup e remover da tabela LOG principal
Should I use another database system, maybe MongoDB?
Qualquer banco de dados vem com seus próprios problemas e contras, você pode usar o design em qualquer RDBMS.Uma comparação útil de bancos de dados baseados em documentos como MongoDB pode ser encontrado aqui
espero ser útil.