Привет, в настоящее время я работаю над решением аналогичной проблемы, я решаю ее, разделив свои таблицы на две части: контрольную таблицу и таблицу данных. Управляющая таблица будет содержать первичный ключ и ссылку на таблицу данных, таблица данных будет содержать ключ пересмотра с автоматическим приращением и первичный ключ управляющей таблицы в качестве внешнего ключа.
взяв в качестве примера таблицу записей
Entries Table
+----+-------+------+--------+--------+
| id | title | text | index1 | index2 |
+----+-------+------+--------+--------+
становится
entries entries_data
+----+----------+ +----------+----+--------+------+--------+--------+
| id | revision | | revision | id | title | text | index1 | index2 |
+----+----------+ +----------+----+--------+------+--------+--------+
на запрос
select * from entries join entries_data on entries.revision = entries_data.revision;
вместо обновления таблицы records_data вы используете оператор вставки, а затем обновляете редакцию таблицы записей новой редакцией таблицы записей.
Преимущество этой системы заключается в том, что вы можете переходить к другим ревизиям, просто изменяя свойство ревизии в таблице записей. Недостатком является необходимость обновления ваших запросов. В настоящее время я интегрирую это в слой ORM, чтобы разработчики не беспокоились о написании SQL. Еще одна идея, с которой я играю, - создать централизованную таблицу ревизий, которую используют все таблицы данных. Это позволит вам описать состояние базы данных с помощью одного номера ревизии, аналогично тому, как работают номера ревизий Subversion.