Rolando sua própria Plaintext Wiki (Wiki dentro de um DB)
-
03-07-2019 - |
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.
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:
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.