Существует несколько вариантов; самое простое, конечно, просто записывать все версии самостоятельно. Для такого сайта, как stackoverflow, где сообщения обычно не редактируются очень часто, это подходит. Однако для чего-то вроде википедии нужно быть более умным, чтобы сэкономить место.
В случае википедии страницы изначально хранятся с каждой версией отдельно, в text table. Периодически несколько старых версий сжимаются вместе, а затем упаковываются в одно поле. Поскольку будет много повторений, вы сохраните много места таким образом.
Возможно, вы также захотите изучить, как это делают некоторые системы контроля версий - например, subversion использует skip deltas, где ревизии хранятся как разница от пересмотра на полпути вниз по истории. Это означает, что нужно будет рассмотреть не более O (lg n) ревизии, чтобы восстановить пересмотр интересов.
Git, с другой стороны, использует нечто более похожее на подход Википедии. Изменения сначала сохраняются как индивидуально сжатые «свободные» объекты, затем периодически git принимает все свободные объекты, сортирует их в соответствии с несколько сложной эвристикой, а затем создает сжатые дельта между «ближайшими» объектами и выдает результат как packfile. Количество исправлений, которые необходимо прочитать для восстановления файла, ограничено аргументом процесса сборки пакета. У этого есть интересное свойство, что дельта может быть построена между объектами, которые не связаны, в некоторых случаях.
+1 хороший вопрос –