2009-03-04 2 views
6

Кто-нибудь знает API (предпочитаемый php, но меня интересует какой-либо язык) для создания wiki-подобного хранилища данных?Роллинг вашей собственной вики-страницы (Wiki внутри БД)

Как насчет каких-либо ресурсов при сканировании собственной вики-статьи? Как другие файлы с открытым текстом обрабатывают формат текстового файла?

Я понимаю, что для форматирования я могу использовать Markdown или Textile. Но меня больше всего интересует, как подойти к хранилищу незашифрованных многопользовательских прав.

Я пишу веб-приложение, которое в основном управляется базой данных. Я хочу, чтобы по крайней мере одно текстовое поле этой базы данных было в формате wiki. В частности, этот текст может быть отредактирован несколькими пользователями с возможностью откат к любой версии. Подумайте, раздел wiki/bio от Last.FM (почти весь сайт строго структурирован по базе данных, за исключением этого раздела для каждого исполнителя).

До сих пор мой подход разделить MediaWiki и вклинивать его в базу данных, кажется, излишним. Я думаю, что было бы гораздо проще свернуть мою собственную wiki-файл и сохранить этот файл в соответствующем текстовом поле базы данных.

+0

Вы не можете добавить новые таблицы в базе данных или что-то? Я не понимаю, почему вы хотите создать вики-страницу «plaintext» внутри базы данных. Может быть, я просто не понимаю вашу терминологию. –

+0

Я бы хотел, чтобы эквивалент одной вики-страницы, хранящейся в одном текстовом поле в моей базе данных – ack

+0

Ìt неясно, является ли ответ на ваш вопрос: «MySql имеет текстовый тип данных для большого материала» или если вы просите что-то более сложное в вопросах управления версиями и т. д. –

ответ

15

Итак, в основном это «как мне изменить текстовую информацию в моей БД».

Ну, самый простой способ - просто копировать данные.

Просто создайте таблицу «версия», которая хранит «старые версии» данных и свяжет ее с вашей основной таблицей.

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 

Тогда вы можете хранить эту difffile как "версия 1".

Чтобы восстановить версию 1 из версии 2, вы получаете данные версии 2, запускаете патч на нем с использованием данных файла diff, и это дает вам v1.

Если вы хотите перейти от v3 в v1, вам нужно сделать это дважды (один раз, чтобы получить v2, а затем снова получить v1).

Это снижает нагрузку на носитель, но увеличивает вашу обработку (очевидно), поэтому вам придется судить, как вы хотите это сделать.

+0

хороший подход, я посмотрю на это! – ack

+0

Замечательно простой и эффективный по сравнению с mediawiki http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png – Cherian

+0

btw y do u need change_date date and change_user_id целочисленные ссылки пользователей (id) в таблица документов? не может быть выведено из таблицы версий? – Cherian

0

Вот список всех 12 вики-файлов на WikiMatrix, написанных на PHP и хранящихся в текстовых файлах. Возможно, один из них будет иметь метод хранения вы можете адаптироваться в базу данных:

http://www.wikimatrix.org/search.php?sid=1760

0

Это звучит, как вы, по сути просто ищете для контроля версий. Если это так, вам может понадобиться изучить алгоритм diff.

Категория: Википедия Diff страница.

Я сделал быстрый поиск google php diff, но ничего действительно не выделялось как достойный пример, так как у меня есть только базовые знания PHP.

2

Ответ на огромный ответ на это, но можно подвести итог, я думаю: вам нужно сохранить версии, а затем вам нужно сохранить метаданные (кто, что из данных).

Но ваш вопрос касался ресурсов по вики-подобному управлению версиями. У меня нет (ну, один: Will's answer above). Однако, о хранении Wikis, у меня есть один. Выезд the comparison matrix from DokuWiki. Я знаю. Вы думаете: «Какая разница, какой бренд использует БД? Поскольку DokuWiki использует текстовые файлы. Вы можете открыть их, и они действительно равны. Итак, это один из подходов, и у них есть некоторые интересные аргументы в отношении того, почему СУБД - это не лучший способ. Они даже не содержат много метаданных: большая часть материала выполняется через плоские файлы.

Точка DokuWiki для вас, что может быть, это относительно простая задача (в зависимости от того, насколько хорошо вы хотите решить :)

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

  • Нет связанных вопросов^_^