Система, которую мы используем и которой довольны:
Для каждой таблицы, для которой требуется история, мы создаем аналогичную таблицу и добавляем в конце поле отметки времени, которое становится частью PK.
Каждое обновление в исходной таблице мы вставляем в таблицу истории с такими же условиями:
update table x WHERE somthing something
insert into table x_history
select * from x WHERE something something
Сохраняет ваши данные в чистоте, а таблицы тонкими.