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

Mantendo o histórico de alterações de página. Um pouco como o SO faz para revisões


Oi estou atualmente trabalhando na solução de um problema semelhante, estou resolvendo dividindo minhas tabelas em duas, uma tabela de controle e uma tabela de dados. A tabela de controle conterá uma chave primária e referência na tabela de dados, a tabela de dados conterá a chave de revisão de incremento automático e a chave primária da tabela de controle como uma chave estrangeira.

tomando sua tabela de entradas como exemplo
Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+

torna-se
entries             entries_data
+----+----------+   +----------+----+--------+------+--------+--------+
| id | revision |   | revision | id |  title | text | index1 | index2 |
+----+----------+   +----------+----+--------+------+--------+--------+

para consulta
select * from entries join entries_data on entries.revision = entries_data.revision;

em vez de atualizar a tabela de dados_entradas, você usa uma instrução insert e, em seguida, atualiza a revisão da tabela de entradas com a nova revisão da tabela de entradas.

A vantagem deste sistema é que você pode passar para diferentes revisões simplesmente alterando a propriedade de revisão na tabela de entradas. A desvantagem é que você precisa atualizar suas consultas. Atualmente, estou integrando isso em uma camada ORM para que os desenvolvedores não se preocupem em escrever SQL de qualquer maneira. Outra ideia com a qual estou brincando é que haja uma tabela de revisão centralizada que todas as tabelas de dados usem. Isso permitiria que você descrevesse o estado do banco de dados com um único número de revisão, semelhante a como os números de revisão do subversion funcionam.