Я думаю, проблема в том, что ваша таблица PERSONS больше не содержит только информацию о PERSONS. Он также содержит информацию об обновлениях. То, что я собираюсь рекомендовать, вероятно, не уменьшит размер вашей базы данных; но это немного облегчит понимание и работу с ним.
PERSONS
PersonID, Name, Height
1 Eric 71
2 Sarah 72
3 Bill 76
UPLOAD
UploadID, UploadTime
1 3/09/2011
2 4/01/2011
3 4/11/2011
PERSONS_EDIT
PersonID, UploadID, ChangeSQL, ChangeDescription
1 1 "insert into PERSONS(Name, Height) VALUES('Erik', 71)" "Erik added"
1 2 "update PERSONS set name='Eric' where Name='Erik'" "Changed Erik's name"
.... ... ...... ....
Я не думаю, что вы можете сделать намного больше, чтобы сделать ваши таблицы проще или базу данных меньше. Как видите, ваша таблица PERSONS_EDIT станет вашей самой большой таблицей. База данных, которую вы используете, может предоставить механизмы для этого автоматически (какая-то запись транзакций или что-то в этом роде), но я никогда не использовал ничего подобного, поэтому я оставлю это другим людям в Stackoverflow, чтобы они делали какие-либо предложения, если они существовать. Если таблица PERSONS_EDIT становится слишком большой, вы можете посмотреть на удаление записей старше недели / месяца / года. Решение о том, когда это сделать, будет зависеть от вас.
Некоторые другие причины для внесения этого изменения в вашей первой таблице вам пришлось использовать PersonId и UploadID в качестве первичного ключа для вашей таблицы персон. Таким образом, чтобы получить самую последнюю версию ЧЕЛОВЕКА в вашем приложении, вам нужно было бы сделать что-то, где вы выбираете человека по идентификатору, а затем заказать его по UploadId и выбрать тот, у которого самый большой идентификатор загрузки КАЖДЫЙ РАЗ, КОТОРЫЙ ВЫ ДЕЛАЕТЕ СДЕЛКА НА ОДНОГО ЛИЦА.
Еще одним преимуществом является то, что вам не нужно делать кучу необычных SQL, чтобы получить историю редактирования. Просто сделайте выбор * из таблицы PERSONS_EDIT.