Есть несколько вариантов; проще всего, конечно, просто записать все версии независимо. Для сайта, подобного stackoverflow, где сообщения обычно не редактируются очень много раз, это подходит. Однако для чего-то вроде википедии нужно быть умнее, чтобы сэкономить место.
В случае википедии страницы изначально сохраняются с каждой отдельной версией в текстовой таблице . Периодически несколько старых ревизий сжимаются вместе, а затем упаковываются в одно поле. Поскольку повторений будет много, вы сэкономите много места таким образом.
Вы также можете посмотреть, как это делают некоторые системы контроля версий - например, Subversion использует Пропуск дельт , где ревизии хранятся как отличия от ревизий на полпути вниз по истории. Это означает, что нужно будет проверить не более O (LG N) ревизий, чтобы восстановить свою ревизию интересов.
Git, с другой стороны, использует нечто более похожее на подход википедии. Ревизии сначала сохраняются как отдельно сжатые «незакрепленные» объекты, затем периодически git берет все незакрепленные объекты, сортирует их по несколько сложной эвристике, затем строит сжатые дельты между «близлежащими» объектами и выводит результат как packfile . Количество ревизий, которые необходимо прочитать для восстановления файла, ограничено аргументом процесса сборки пакета. Это имеет интересное свойство, что в некоторых случаях дельты могут создаваться между несвязанными объектами.