Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

[Dúvida] Logs e armazenamento de histórico

Bom dia

Abaixo seguem reflexões para expor a minha principal dúvida que é em relação a gerar histórico de alteração de informações

Considerando as modelagens abaixo como um exemplo real (mesmo que conceitual, pode-se imaginar que a partir dela já seria feito o modelo físico / criação do banco. Qual a melhor ou forma mais indicada para se armazenar históricos de alteração dos dados das tabelas e seus relacionamentos

REFLEXÃO: na primeira abordagem abaixo, é um exemplo clássico em que na minha percepção eu iria conseguir somente ter o histórico de qual administrador realizou a criação do restaurante, e que ficaria restrito a existir um restaurante somente atrelado a um único administrador, ou seja, não seria possível saber em uma situação de UPDATE, qual administrador alterou qual restaurante e quais informações / campos sofreram mudanças.

Diante do exposto logo acima, pensei em uma possível forma de armazenar o histórico de alterações, conforme segunda abordagem abaixo: Ao criar uma entidade associativa (ADMINISTRATOR_RESTAURANT) que armazena o ID do administrador + ID do restaurante e data de modificação, logo eu conseguiria identificar qual o administrador que alterou um determinado restaurante e quando foi realizada tal alteração. Porém, para que eu consiga saber quais informações foram alteradas, eu teria que REPLICAR os mesmos campos que existem em Restaurant, nesse entidade associativa (como tal está na segunda imagem, com os campos OPENING_HOURS, STATUS, NAME, CATEGORY)

Com essa abordagem, eu conseguiria manter o histórico das alterações, porém seguem os questionamentos:

  • Será que replicar os mesmos campos existentes em Restaurant nessa entidade associativa Administrator_Restaurant, seria adequado? uma vez que se caso o administrador alterar somente um campo (ex: NAME), os demais ficaria NULL ?
  • Na grande maioria dos casos, encontro modelagens igual a abordagem 1 abaixo, porém, como que realizam o controle e histórico de atualizações?
  • Realizando pesquisas, alguns utilizam técnicas de log de auditoria de transação, isso seria o suficiente (caso positivo, há algum curso na plataforma que abrange o tema a fundo?), ou há uma abordagem mais generalista e recomendada?
  • Conforme referência (https://dirceuresende.com/blog/sql-server-como-criar-um-historico-de-alteracoes-de-dados-para-suas-tabelas-logs-auditoria/) o autor sugere o uso de Trigger para cada tabela do banco, mas isso pode ser "custoso" se forem inseridas novas colunas na tabela e ter que ficar adicionando também na tabela correspondente da trigger.
  • É recomendado implementar logs do lado da aplicação (desenvolvedor) ou do lado do Banco de Dados? pois pelo que vi, se for escolhido pelo lado da aplicação, não será possível rastrear usuários que alterarem diretamente via query o banco de dados, mas sim somente usuários que fizeram a autenticação e possuem login ao lado da aplicação
  • Se no lado da aplicação (desenvolvedor) adotar o uso de ORM (mapeamento de objeto relacional), todo esse conceito de gerenciar logs via triggers é perdido, existe alguma abordagem?
  • Em resumo, considerando a modelagem e implementação de um projeto real genérico e toda a reflexão acima, qual a metodologia mais comum para se gerenciar histórico de atualizações de dados?

1) PRIMEIRA ABORDAGEM

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

2) SEGUNDA ABORDAGEM

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obrigado

Felipe D.R

5 respostas

Boa tarde

Por gentileza, algum retorno?

Boa tarde,

Por gentileza, algum retorno?

Boa noite,

Por gentileza, algum retorno?

solução!

Olá, tudo bem?

Normalmente a primeira abordagem é a mais comum, já que normalmente é armazenado apenas informações, como data, hora e o usuário que realizou a alteração.

A segunda forma, normalmente é utilizada em Business Intelligence, quando existe a necessidade de se ter o histórico dos dados para realizar uma tomada de decisão baseado nas informações ao longo do tempo. Porém, o banco de dados possui uma estrutura e um objetivo diferente.

Como não tenho a informação do porquê da necessidade de armazenar essas informações, não tenho como te informar com certeza qual delas seria a melhor opção, pois vai depender muito das necessidades do seu projeto e como essas informações seriam utilizadas.

  • Como os dados armazenados estarão em tabelas distintas, não seria um problema ter os mesmos campos, porém, como você mencionou nem sempre todos os campos da tabela serão alterados, então, seria necessário definir como isso seria tratado, já que em banco de dados relacionais, temos que definir de antemão a estrutura das nossas tabelas. Os campos poderiam ficar como Null, sem valor algum ou receber outras informações, essa decisão deve ser tomada em cima das necessidades do seu projeto.
  • Em relação a sua segunda abordagem, a entidade associativa geralmente é utilizada quando precisamos trabalhar com uma relação n:m, ou seja, muitos para muitos, o que não é o caso da relação restaurante-administrador.
  • Pensando a longo prazo, essa tabela vai crescer muito, já que ela irá armazenar todas alterações que a tabela sofrer. Dessa forma, será utilizado uma grande quantidade de espaço para armazenar essas informações.
  • Não tenho muitos conhecimentos sobre as técnicas de log de auditoria de transação, mas parece uma boa opção para o que você deseja fazer, já que você pode armazenar informações de log de conexão, do usuário e de suas atividades, como registrar cada consulta antes de ser executada no banco de dados. Porém, a decisão de utilizar ou não, deve depender das necessidades do seu projeto.
  • Trigger seria uma outra opção para automatizar este processo, já que seria possível criar um gatilho para ser acionado sempre que a tabela sofresse alterações e de forma automática inserir as informações na tabela auxiliar.
  • Sim, seria uma opção utilizar a aplicação, porém essas informações não seriam armazenadas no banco de dados e sim no agente de logs. Então, caso você não precise usar a informação, apenas realizar verificações, é uma opção viavel.

O ideal é que neste momento, você entenda a real necessidade do seu projeto. Caso seja necessário realmente armazenar todas essas informações, essa tabela irá utilizar muito espaço de armazenamento, entre outras questões que podem gerar problemas futuramente, caso o projeto não seja bem estruturado.

Aqui na plataforma da Alura, temos uma formação completa sobre como modelar um projeto de banco de dados. Caso você ainda não tenha feito essa formação, indico como um material de estudo, pois, com estes cursos, você vai aprender conceitos que podem ajudar a modelar e entender o seu projeto.

Boa noite

Obrigado pelo retorno e todas considerações, Danielle,

No caso esse projeto é para praticar mesmo (desenvolver a API após definir a modelagem de dados e integrar com um banco Relacional / consumir no front-end...), porém estava avaliando aspectos que eu poderia considerar, para se aproximar de um projeto real e como normalmente definem essa questão do armazenamento do histórico e alterações de dados em um contexto real......até pensando dentro ou além do contexto de restaurante, um administrador que alterasse o preço de uma refeição / produto, acredito que seria interessante ter o histórico do valor anterior, para caso precisasse de se recuperar e retornar ao original.

Bacana sobre o que informou que a segunda abordagem seria mais para um tipo de projeto voltado a BI para validar as alterações / histórico nos dados. O segundo modelo em que usei a entidade associativa, foi para representar que um administrador, no caso poderia alterar um ou mais restaurantes e que cada restaurante deve ser alterado por um ou vários administradores distintos.

Já havia concluído a Formação de modelagem também, mas obrigado.

Atenciosamente Felipe D.R