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.