Как эффективно хранить историю изменений? - PullRequest
35 голосов
/ 02 августа 2009

Мне просто было интересно узнать о таких сайтах, как stackoverflow и wikipedia, они хранят историю изменений бесконечно и позволяют пользователю откатывать изменения. Может ли кто-нибудь порекомендовать какие-либо ресурсы / книги / статьи о том, как это сделать, используя любую подходящую технологию (например, базы данных и т. Д.)

Большое спасибо!

1 Ответ

16 голосов
/ 03 августа 2009

Есть несколько вариантов; проще всего, конечно, просто записать все версии независимо. Для сайта, подобного stackoverflow, где сообщения обычно не редактируются очень много раз, это подходит. Однако для чего-то вроде википедии нужно быть умнее, чтобы сэкономить место.

В случае википедии страницы изначально сохраняются с каждой отдельной версией в текстовой таблице . Периодически несколько старых ревизий сжимаются вместе, а затем упаковываются в одно поле. Поскольку повторений будет много, вы сэкономите много места таким образом.

Вы также можете посмотреть, как это делают некоторые системы контроля версий - например, Subversion использует Пропуск дельт , где ревизии хранятся как отличия от ревизий на полпути вниз по истории. Это означает, что нужно будет проверить не более O (LG N) ревизий, чтобы восстановить свою ревизию интересов.

Git, с другой стороны, использует нечто более похожее на подход википедии. Ревизии сначала сохраняются как отдельно сжатые «незакрепленные» объекты, затем периодически git берет все незакрепленные объекты, сортирует их по несколько сложной эвристике, затем строит сжатые дельты между «близлежащими» объектами и выводит результат как packfile . Количество ревизий, которые необходимо прочитать для восстановления файла, ограничено аргументом процесса сборки пакета. Это имеет интересное свойство, что в некоторых случаях дельты могут создаваться между несвязанными объектами.

...