Отмена действий

FireTiger

Новичок
Отмена действий

Собственно сабж. Как реализовать систему отмены действий любой группы пользователей. Например как это сделано на википедии. Там выводятся все правки которые были совершены, и, если что-то не устраивает, ты отменяешь это действие и восстанавливаешь данные ранее сохраненные. Вопрос собственно в том, как все это организовать? Куда лучше записывать данные, с какой переодичностью и т.д.
 

FireTiger

Новичок
Вы предлагаете расбирать код википеди??

Мне бы знать систему, как это все сделать
 

Wicked

Новичок
Это называется версионностью данных.

Просто при изменении данных нужно добавлять новую версию. Она же и будет показываться пользователям.
 

FireTiger

Новичок
спасибо, идею понял. Но а где хранить тогда старую? Смотрите, скрипт делает запрос на обновление данных, при этом старые данные должны тоже сохранится. Допустим у меня есть таблицами с данными, скрипт ее обновляет и при этом добаляет сохраненную копию в другую таблицу. Но а как сделать например, чтобы все данные даже которые были год назад тоже оставались? Что создавать кучу таблиц с разными версиями?
 

Wicked

Новичок
FireTiger
во второй таблице хранить не-сколь-ко версий одной и той же статьи, а не одну. Т.е. если добавили статью "a", потом изменили ее на "b", потом изменили на "c", то получаем в главной таблице запись (1, "c"), а в таблице версий 2 записи (fk, ver, text): (1, 1, "a"), (1, 2, "b").
 

FireTiger

Новичок
Во, это то что нужно, огромное спасибо, а как быть, когда текст страницы огромный, скажем 100 Кб, то как в этом случае фиксировать изменения? Нельзя ведь при каждом малом редактировании копировать этот огромный текст и сохранять в базе? А если страниц будет больше 100 тысяч и каждая из них будет редактироватся очень часто? База очень сильно засорится... Как же быть?
 

FireTiger

Новичок
А всмысле патчи? Вы имеете ввиду что не хранить полные версии, а только каким-то образом (!!), фиксировать и сохранять текст, который был изменен?
 

FireTiger

Новичок
Спасибо, буду расбиратся! А можно вкратце объяснить, что собой представляет те системы? (те что Вы в ссылках указали)
 

Wicked

Новичок
это классы/функции для создания списка отличий в формате unified diff ( http://en.wikipedia.org/wiki/Diff ) и их последующего применения.

Если мы в тексте на 100кб исправили опечатку, то diff будет содержать примерно такое описание:
Код:
-check this dokument. On
+check this document. On
+ небольшое кол-во служебной информации. Поэтому можно хранить оригинальный документ + все diff'ы, применением которых можно получить последнюю версию.

А еще лучше хранить последнюю версию + все diff'ы, применением которых можно получить оригинальную. Просто из соображений производительности.
 

FractalizeR

Новичок
Автор оригинала: FireTiger
А всмысле патчи? Вы имеете ввиду что не хранить полные версии, а только каким-то образом (!!), фиксировать и сохранять текст, который был изменен?
Не думаю, что это стоит делать. Иначе восстановление сотой по счету версии займет уйму времени. Лучше сделайте так, как сделано в DokuWiki (www.splitbrain.org): актуальная версия хранится как есть, а все архивные копии упакованы gzip.
 

FireTiger

Новичок
FractalizeR
То есть архвные копии хранятся не в базе, а в файлах? И опять же хранится полная верия документа, которая заново создается при изменении?

-~{}~ 18.02.08 05:17:

Автор оригинала: Wicked

А еще лучше хранить последнюю версию + все diff'ы, применением которых можно получить оригинальную. Просто из соображений производительности.
Чувствую идея отличная, но мне нужно еще разобратся с тем классом и понять всю суть этого метода... Я никогда не слышал про diff'ы... Если что буду спрашивать
 

Андрейка

Senior pomidor developer
FireTiger
если у тя мало данных, то не стоит мучиться с диффом.. лучше хранить полные версии (можно сжатые.. пофик в базе или файлах)
если у тя тысячи версий одного текста, то не стоит мучиться с диффом, ибо восстановление сотой по счету версии займет уйму времени© - чтобы вывести различия в 2х текстах тебе прийдется откопать оригинал, выбрать все патчи к нему и применить их.. а потом снова сделать diff для 2х полученных версий.
 

FireTiger

Новичок
Автор оригинала: Андрейка
чтобы вывести различия в 2х текстах тебе прийдется откопать оригинал, выбрать все патчи к нему и применить их.. а потом снова сделать diff для 2х полученных версий.
Да, копий будет уйма. Ну а как же тогда на википедии сделано? Видели, там при просмотре страницы, вверху жмешь "История", и там целая система по изменению версий...
 

FireTiger

Новичок
Чесно сказать, боюсь я его)))
Хотя я не новичек, но спрошу как у профессионалов, стоит ли смотреть чужие решения и просто копировать их идеи?
 

jonjonson

Охренеть
FireTiger, просто копировать или не просто копировать... Это тебе виднее :)
 
Сверху