Pregunta

¿Alguien sabe de una API (php preferible pero estaría interesado en cualquier idioma) para crear un almacenamiento de datos similar a un wiki?

¿Qué hay de los recursos para rodar tu 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 formato. Pero lo que más me interesa es cómo abordar el almacenamiento de texto plano de las ediciones para múltiples usuarios.

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

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

¿Fue útil?

Solución

Así que, básicamente, esto es un " ¿cómo puedo actualizar la información de texto en mi base de datos " ;.

Bueno, la forma más sencilla es simplemente copiar los datos.

Simplemente, crea una " versión " tabla que contiene " versiones antiguas " de los datos y vincúlalos 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, copie el valor del texto antiguo en esta tabla, copie al usuario y cambie la fecha y elimine 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 activador si su base de datos los 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 seguirá siendo grande). Puedes mitigar eso usando algo como diff (1) y patch (1).

Por ejemplo:

diff version2.txt version1.txt > difffile

Luego puedes almacenar ese 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 un parche utilizando los datos del archivo diff, y eso le da v1.

Si quieres pasar de v3 a v1, debes hacer esto dos veces (una para obtener v2 y luego para obtener v1).

Esto reduce su carga de almacenamiento, pero aumenta su procesamiento (obviamente), por lo que tendrá que juzgar cómo quiere hacer esto.

Otros consejos

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

Pero tu pregunta fue sobre recursos en versiones de estilo Wiki. No tengo ninguno (bueno, uno: respuesta de Will arriba ). Sin embargo, sobre el almacenamiento de Wikis, tengo uno. Visite la matriz de comparación de DokuWiki . Lo sé. Estás pensando " ¿qué es lo que me importa qué marca de Wikis diferentes usan? & Quot; Porque DokuWiki usa archivos de texto plano. Puedes abrirlos y son de hecho sencillos. Así que ese es un enfoque, y tienen algunos argumentos interesantes sobre por qué los DBMS no son la mejor manera de hacerlo. Ni siquiera tienen muchos metadatos: la mayoría de las cosas se hacen a través de los archivos sin formato.

El punto del DokuWiki para ti es que tal vez sea un problema relativamente simple (dependiendo de lo bien que quieras resolverlo :)

Aquí hay una lista de las 12 wikis en WikiMatrix que están escritas en PHP y hacen su almacenamiento usando archivos de texto. Quizás uno de ellos tenga un método de almacenamiento que pueda adaptar a la base de datos:

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

Parece que básicamente solo buscas el control de versiones. Si ese es el caso, es posible que desee ver en un algoritmo diff.

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top