Pergunta

Alguém sabe de uma API (php preferível, mas eu estaria interessado em qualquer língua) para a criação de wiki-como armazenamento de dados?

Como sobre quaisquer recursos sobre rolando seu próprio wiki texto simples? Como wikis texto simples lidar com o formato do arquivo de texto?

Eu entendo que eu posso usar Markdown ou Têxteis para a formatação. Mas o que eu estou mais interessado é como abordar o armazenamento de texto plano de edições multi-usuário.

Eu estou escrevendo uma aplicação web que é impulsionada principalmente banco de dados. Eu quero pelo menos um campo de texto deste banco de dados para estar em um formato wiki-like. Especificamente, este texto pode ser editado por vários usuários com a capacidade de reverter para qualquer versão. Pense seção wiki / bio das Last.FM (quase todo o site é estritamente estruturado por um banco de dados, exceto para esta seção por artista).

Até agora, a minha abordagem de desmontar MediaWiki e cunha-lo em um banco de dados parece um exagero. Eu estou pensando que seria muito mais fácil de fazer a minha própria wiki texto simples, e armazenar esse arquivo no campo de texto apropriado do banco de dados.

Foi útil?

Solução

Então, basicamente este é um "como é que a informação da versão do texto que eu no meu DB".

Bem, a maneira mais simples é simplesmente copiar os dados.

Simplesmente, crie uma tabela "versão" que contém "versões antigas" dos dados, e vinculá-lo de volta para sua mesa principal.

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
}

Sempre que você atualizar seu documento original, você copiar o valor de texto de idade para esta tabela, copie a data de usuário e mudança e bater a versão.

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;

Você mesmo pode fazer isso em um gatilho se o seu DB suporta os.

Falhas com este método é que é uma cópia completa dos dados (por isso, se você tem um grande documento, a versão estadia grande). Você pode atenuar que, usando algo como diff (1) e patch (1).

Por exemplo:

diff version2.txt version1.txt > difffile

Em seguida, você pode armazenar que difffile como "versão 1".

A fim de recuperar a versão 1 da versão 2, você pegar a versão 2 de dados, remendo rodar nele usando os dados do arquivo diff, e que lhe dá v1.

Se você quiser ir de v3 para v1, você precisa fazer isso duas vezes (uma vez para obter v2, e depois novamente para obter v1).

Isso reduz sua carga de armazenamento, mas aumenta o seu processamento (obviamente), então você vai ter que julgar como você deseja fazer isso.

Outras dicas

resposta enorme de Will é certo, mas pode ser resumido, eu penso: o que você precisa para armazenar as versões, e então você precisa para armazenar os metadados (quem que quando dos dados)

.

Mas a sua pergunta foi sobre recursos na Wiki-como a versão. Eu não tenho nenhum (bem, uma: resposta de Will acima). No entanto, sobre o armazenamento de Wikis, eu tenho um. Confira a matriz de comparação de DokuWiki . Eu sei. Você está pensando "Que me importa o que marca de DB uso diferente Wikis?" Porque DokuWiki utiliza arquivos de texto simples. Você pode abri-los e eles são realmente simples. Então essa é uma abordagem, e eles têm alguns argumentos interessantes a respeito de porque DBMS não são o melhor caminho a percorrer. Eles nem sequer segurar muito metadados: a maioria do material é feito através dos próprios arquivos simples.

O ponto do DokuWiki para você é que talvez seja um problema relativamente simples (dependendo de quão bem você quer resolvê-lo:)

Aqui está uma lista de todos os 12 wikis sobre WikiMatrix que são escritas em PHP e fazer o seu armazenamento usando arquivos de texto. Talvez um deles terá um método de armazenamento que você pode adaptar para o banco de dados:

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

Parece que são essencialmente apenas à procura de controle de versão. Se for esse o caso, você pode querer olhar para um algoritmo diff.

Aqui está a página Diff Wikipedia.

Eu fiz um php Diff Quick Pesquisa do Google, mas nada realmente se destacou como um exemplo decente, já que eu só tenho conhecimento básico PHP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top