Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Armazenando alterações em entidades:MySQL é a solução adequada?


Se eu estivesse enfrentando o problema que você mencionou, eu criaria a tabela LOG como abaixo:

  1. EntityName :(String) Entidade que está sendo manipulada.(obrigatório)
  2. ObjectId :Entidade que está sendo manipulada, chave primária.
  3. FieldName :(String) Nome do campo da entidade.
  4. OldValue :(String) Valor antigo do campo de entidade.
  5. NewValue :(String) Novo valor do campo de entidade.
  6. UserCode :Identificador exclusivo do usuário do aplicativo. (obrigatório)
  7. 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)
  8. ChangeDate :Data da transação. (obrigatório)
  9. 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.