Hola, actualmente estoy trabajando en una solución a un problema similar, lo estoy resolviendo dividiendo mis tablas en dos, una tabla de control y una tabla de datos. La tabla de control contendrá una clave principal y una referencia a la tabla de datos, la tabla de datos contendrá una clave de revisión de incremento automático y la clave principal de la tabla de control como clave externa.
tomando su tabla de entradas como ejemplo
Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+
se convierte
entries entries_data
+----+----------+ +----------+----+--------+------+--------+--------+
| id | revision | | revision | id | title | text | index1 | index2 |
+----+----------+ +----------+----+--------+------+--------+--------+
para consultar
select * from entries join entries_data on entries.revision = entries_data.revision;
en lugar de actualizar la tabla de datos_entradas, utiliza una declaración de inserción y luego actualiza la revisión de la tabla de entradas con la nueva revisión de la tabla de entradas.
La ventaja de este sistema es que puede pasar a diferentes revisiones simplemente cambiando la propiedad de revisión dentro de la tabla de entradas. La desventaja es que necesita actualizar sus consultas. Actualmente estoy integrando esto en una capa ORM para que los desarrolladores no tengan que preocuparse por escribir SQL de todos modos. Otra idea con la que estoy jugando es que haya una tabla de revisión centralizada que utilicen todas las tablas de datos. Esto le permitiría describir el estado de la base de datos con un solo número de revisión, similar a cómo funcionan los números de revisión de Subversion.