Подтвердить что ты не робот

Как эффективно хранить историю изменений?

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

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

4b9b3361

Ответ 1

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

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

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

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