Um exemplo de registro de versão simples do PostgreSQL

Quando vi a implementação do “histórico de registros” - versionamento, ao lado do programa, trabalhando com o banco de dados SQL. Antes de alterar o registro, a versão antiga foi obtida do banco de dados, gravada em XML e a sequência XML resultante foi gravada em uma tabela de versão separada.

Inicialmente, em seu programa, ele planejava fazer versões mais tarde, não havia necessidade urgente. Lembro que havia um desejo de usar o tipo de dados jsonb em algum lugar, assim que pensei em uma implementação simples e concisa do controle de versão no lado do SQL, não consegui fazê-lo. Somente uma tabela de versão com 5 colunas e uma função de disparo em 3 linhas de código.

Para descrever a implementação de uma tabela de versão não é suficiente, é necessário descrever mais algumas tabelas, por exemplo.

Em quase todos os bancos de dados, com raras exceções, há uma tabela de usuários - usuários. É útil armazenar o histórico de alterações - versões do usuário, por exemplo, para a capacidade de reverter para a versão antiga, pelo próprio usuário.

Exemplo de tabela do usuário:

imagem

Os dois últimos campos da figura são necessários para a tabela de versões, eles também podem ser chamados de "autor da versão" e "data da versão", mas, se desejado, você pode ficar sem eles.

Tabela de versão:



Função de disparo para salvar versões:



Os dois primeiros campos são preenchidos a partir do registro salvo OLD.changestamp e OLD.userid.
Na tabela de versões, não apenas as entradas da tabela de usuários podem ser armazenadas, o terceiro campo é o hash MD5 do nome da tabela com versão, convertido em uuid.

Os exemplos anteriormente descreviam uma estrutura muito simples, mas, como regra, vários dados de referência podem ter tabelas adicionais com um relacionamento um para muitos.

Por exemplo, a tabela "Grupos de usuários".



E a segunda tabela é "Usuários do grupo", a composição do grupo são os usuários do grupo.



Para não complicar o mecanismo simples de controle de versão, você pode fazer uma pequena duplicação de dados na tabela de grupos, adicionar um campo jsonb que repete a estrutura da tabela "Usuários do Grupo".



Para simplificar o trabalho com dados duplicados, é possível criar uma função de disparo adicional, com INSERT ou UPDATE, preenchendo a tabela "Usuários do Grupo" no campo jsonb.



A duplicação descrita acima é necessária apenas quando é necessário obter dados da tabela com frequência e o mais rápido possível. Por exemplo, se uma consulta é frequentemente feita na tabela "Usuários do Grupo" para determinar se um usuário é membro do grupo Administradores. Em outros casos, os dados podem ser obtidos consultando diretamente o campo jsonb e não usando uma tabela duplicada.

O código de exemplo completo está aqui

Source: https://habr.com/ru/post/pt423399/


All Articles