Кто-нибудь знает API (php предпочтительнее, но меня интересует какой-либо язык) для создания вики-подобного хранилища данных?
Как насчет каких-либо ресурсов при прокатке собственной вики-страницы? Как другие файлы с открытым текстом обрабатывают формат текстового файла?
Я понимаю, что для форматирования я могу использовать Markdown или Textile. Но меня больше всего интересует, как подойти к хранилищу незашифрованных многопользовательских прав.
Я пишу веб-приложение, которое в основном управляется базой данных. Я хочу, чтобы по крайней мере одно текстовое поле этой базы данных было в формате wiki. В частности, этот текст может быть отредактирован несколькими пользователями с возможностью откат к любой версии. Подумайте о разделе wiki / bio Last.FM (почти весь сайт строго структурирован с помощью базы данных, за исключением этого раздела для каждого исполнителя).
До сих пор мой подход разделить MediaWiki и заклинив его в базу данных, кажется излишним. Я думаю, что было бы гораздо проще свернуть мою собственную wiki-файл и сохранить этот файл в соответствующем текстовом поле базы данных.
Таким образом, в основном это «как мне изменить текстовую информацию в моей БД».
Ну, самый простой способ – просто копировать данные.
Просто создайте таблицу «версия», в которой хранятся «старые версии» данных, и свяжите ее с основной таблицей.
create table docs { id integer primary key not null, version integer not null, create_date date, change_date date, create_user_id integer not null references users(id), change_user_id integer references users(id), text_data text } create table versions { id integer primary key not null, doc_id integer not null references docs(id), version integer, change_date date, change_user integer not null references users(id), text_data text }
Всякий раз, когда вы обновляете исходный документ, вы копируете старое текстовое значение в эту таблицу, копируете пользователя и изменяете дату и нажимаете версию.
select version, change_date, change_user, text_data into l_version, l_change_data, l_change_user, l_text_data from docs where id = l_doc_id; insert into versions values (newid, l_doc_id, l_version, l_change_date, l_change_user, l_text_data); update docs set version = version + 1, change_date = now, change_user = cur_user, text_data = l_new_text where id = l_doc_id;
Вы даже можете сделать это в триггере, если ваша БД поддерживает их.
Ошибки с помощью этого метода заключаются в том, что его полная копия данных (поэтому, если у вас большой документ, версия остается большой). Вы можете смягчить это, используя что-то вроде diff (1) и patch (1).
Например:
diff version2.txt version1.txt > difffile
Тогда вы можете сохранить этот diffffile как «версия 1».
Чтобы восстановить версию 1 из версии 2, вы получаете данные версии 2, запускаете патч на нем с использованием данных файла diff, и это дает вам v1.
Если вы хотите перейти от v3 в v1, вам нужно сделать это дважды (один раз, чтобы получить v2, а затем снова получить v1).
Это снижает нагрузку на носитель, но увеличивает вашу обработку (очевидно), поэтому вам придется судить, как вы хотите это сделать.
Думаю, что это огромный ответ, но можно суммировать, я думаю: вам нужно сохранить версии, а затем вам нужно сохранить метаданные (кто, что из данных).
Но ваш вопрос касался ресурсов по вики-подобному управлению версиями. У меня нет (ну, один: ответ Уилла выше ). Однако, о хранении Wikis, у меня есть один. Посмотрите сравнительную матрицу из DokuWiki . Я знаю. Вы думаете: «Какая разница, какой бренд использует БД? Поскольку DokuWiki использует текстовые файлы. Вы можете открыть их, и они действительно равны. Итак, это один из подходов, и у них есть некоторые интересные аргументы в отношении того, почему СУБД – это не лучший способ. Они даже не содержат много метаданных: большая часть материала выполняется через плоские файлы.
Точка DokuWiki для вас заключается в том, что, возможно, это относительно простая проблема (в зависимости от того, насколько хорошо вы хотите ее решить 🙂
Вот список всех 12 вики на WikiMatrix, написанных на PHP, и их хранение с использованием текстовых файлов. Возможно, у одного из них будет метод хранения, который вы можете адаптировать в базе данных:
Похоже, вы просто ищете контроль версий. Если это так, вам может понадобиться изучить алгоритм diff.
Вот страница Wikipedia Diff .
Я сделал быстрый поиск google php diff, но ничто действительно не выделялось как достойный пример, так как у меня есть только базовые знания PHP.