Можно версионность организовать на основе одной таблицы, достаточно добавить в таблицу поле с timestamp. При изменении просто добавляем новую запись с новым timestamp. Для выбора текущей записи, выбираем запись с наибольшим timestamp. Легко делается интерфейс для просмотра изменений и т.п.
Для удаления, нужно завести поле состояния, куда будет писаться признак удаления, физически записи не удалять.
Подобную схему таблиц с историей неоднократно видел в банковском софте.