2009-08-02 4 views
34

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

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

+3

+1 хороший вопрос –

ответ

14

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

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

Возможно, вы также захотите изучить, как это делают некоторые системы контроля версий - например, subversion использует skip deltas, где ревизии хранятся как разница от пересмотра на полпути вниз по истории. Это означает, что нужно будет рассмотреть не более O (lg n) ревизии, чтобы восстановить пересмотр интересов.

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

+1

Я не знал о пропущенных дельтах, I <3 logn алгоритмах – Patashu

Смежные вопросы