Раскручивая свой собственный открытый текст вики (Wiki внутри БД) - PullRequest
6 голосов
/ 05 марта 2009

Кто-нибудь знает API (желательно php, но я бы заинтересовался любым языком) для создания wiki-подобных хранилищ данных?

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 05 марта 2009

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

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

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

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).

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

2 голосов
/ 05 марта 2009

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

Но ваш вопрос был о ресурсах по Wiki-подобному версионированию. У меня его нет (ну, один: ответ Уилла выше ). Впрочем, насчет хранения вики у меня есть один. Проверьте матрицу сравнения от DokuWiki . Я знаю. Вы думаете: "Какое мне дело, какую марку БД используют разные вики?" Потому что DokuWiki использует простые текстовые файлы. Вы можете открыть их, и они действительно просты. Так что это один из подходов, и у них есть несколько интересных аргументов относительно того, почему СУБД не лучший путь. Они даже не содержат много метаданных: большая часть материала выполняется с помощью простых файлов.

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

0 голосов
/ 05 марта 2009

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

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

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

0 голосов
/ 05 марта 2009

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

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

...