Раскручивая свой собственный открытый текст вики (Wiki внутри БД)

StackOverflow https://stackoverflow.com/questions/613038

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

Затем вы можете сохранить этот файл как "версию 1".

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top