2009-03-04 18 views
6

¿Alguien sabe de una API (preferible php pero me interesaría cualquier idioma) para crear almacenamiento de datos tipo wiki?Rodando su propia Wiki de Plaintext (Wiki dentro de una base de datos)

¿Qué hay de los recursos en la rodadura de su propia wiki de texto plano? ¿Cómo manejan otros wikis de texto plano el formato del archivo de texto?

Entiendo que puedo usar Markdown o Textile para el formateo. Pero lo que más me interesa es cómo acercarme al almacenamiento de texto sin formato de las ediciones de varios usuarios.

Estoy escribiendo una aplicación web que se basa principalmente en bases de datos. Quiero que al menos un campo de texto de esta base de datos esté en formato wiki. Específicamente, este texto puede ser editado por múltiples usuarios con la capacidad de retrotraer a cualquier versión. Piense en la sección wiki/bio de Last.FM (casi todo el sitio está estrictamente estructurado por una base de datos, excepto esta sección por artista).

Hasta ahora, mi enfoque de desarmar MediaWiki y meterlo en una base de datos parece exagerado. Estoy pensando que sería mucho más fácil rodar mi propia wiki de texto claro, y almacenar este archivo en el campo de texto apropiado de la base de datos.

+0

¿No puede añadir nuevas tablas de la base de datos o algo? No estoy siguiendo por qué quieres crear una wiki de "texto claro" dentro de una base de datos. Quizás no entiendo tu terminología. –

+0

Me gustaría tener el equivalente de una sola página wiki almacenada en un solo campo de texto en mi base de datos – ack

+0

No está claro si la respuesta a su pregunta es "MySql tiene un tipo de datos de texto para cosas grandes" o si está pidiendo algo más complejo sobre el control de versiones, etc. –

Respuesta

15

Por lo tanto, básicamente se trata de un "cómo puedo versión de información de texto en mi base de datos".

Bueno, la manera más simple es simplemente copiar los datos.

Simplemente, cree una tabla de "versión" que contenga "versiones antiguas" de los datos, y vincule de nuevo a su tabla 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 
} 

Cada vez que actualice su documento original, copia el valor de texto de edad en esta tabla, copie la fecha de usuario y cambiar y golpee la versión.

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; 

Incluso podría hacer esto en un desencadenador si su DB lo admite.

Las fallas con este método son que es una copia completa de los datos (por lo tanto, si tiene un documento grande, la versión permanece grande). Puedes mitigar eso usando algo como diff (1) y patch (1).

Por ejemplo:

diff version2.txt version1.txt > difffile 

A continuación, puede almacenar esa difffile como "versión 1".

Para recuperar la versión 1 de la versión 2, toma los datos de la versión 2, ejecuta el parche utilizando los datos del archivo diff, y eso le da v1.

Si desea pasar de v3 a v1, debe hacer esto dos veces (una para obtener v2 y otra vez para obtener v1).

Esto reduce la carga de almacenamiento, pero aumenta el procesamiento (obviamente), por lo que tendrá que juzgar cómo desea hacerlo.

+0

buen enfoque, voy a ver esto! – ack

+0

Maravillosamente simple y eficiente en comparación con mediawiki http://upload.wikimedia.org/wikipedia/commons/4/41/Mediawiki-database-schema.png – Cherian

+0

por cierto, necesitas change_date date y change_user_id entero hace referencia a los usuarios (id) en la tabla de documentos? no se puede inferir de la tabla de versiones? – Cherian

0

Aquí hay una lista de los 12 wikis en WikiMatrix que están escritos en PHP y hacen su almacenamiento usando archivos de texto. Tal vez uno de ellos tendrá un método de almacenamiento se puede adaptar a la base de datos:

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

0

Suena como que son esencialmente sólo en busca de control de versiones. Si ese es el caso, es posible que desee buscar en un algoritmo diff.

Aquí está la página de Wikipedia Diff.

Hice una rápida búsqueda de Google php diff, pero nada realmente se destacó como un ejemplo decente, ya que solo tengo conocimientos básicos de PHP.

2

La gran respuesta de Will es correcta, pero se puede resumir, creo: necesitas almacenar las versiones, y luego necesitas almacenar los metadatos (quién y qué de los datos).

Pero su pregunta era acerca de los recursos en versiones de Wiki. No tengo ninguno (bueno, uno: Will's answer above). Sin embargo, sobre el almacenamiento de Wikis, tengo uno. Consulte the comparison matrix from DokuWiki. Lo sé. Estás pensando "¿qué me importa qué marca de DB usan diferentes Wikis?" Porque DokuWiki usa archivos de texto sin formato. Puedes abrirlos y son realmente simples. Entonces ese es un enfoque, y tienen algunos argumentos interesantes sobre por qué DBMS no es el mejor camino a seguir. Ni siquiera tienen muchos metadatos: la mayoría de las cosas se hace a través de los propios archivos planos.

El punto de la DokuWili para usted es que tal vez es un problema relativamente sencillo (dependiendo de lo bien que desea resolver él :)