Domanda

Qualcuno sa di un'API (preferibilmente php ma sarei interessato in qualsiasi lingua) per creare un archivio di dati simile a wiki?

Che ne dici di qualsiasi risorsa per creare la tua wiki in chiaro? In che modo altri wiki in testo normale gestiscono il formato del file di testo?

Capisco di poter usare Markdown o Textile per la formattazione. Ma quello che mi interessa di più è come affrontare l'archiviazione in chiaro di modifiche multiutente.

Sto scrivendo un'applicazione web principalmente basata su database. Voglio che almeno un campo di testo di questo database sia in un formato simile a wiki. In particolare, questo testo può essere modificato da più utenti con la possibilità di ripristinare qualsiasi versione. Pensa alla sezione wiki / bio di Last.FM (quasi l'intero sito è strettamente strutturato da un database ad eccezione di questa sezione per artista).

Finora, il mio approccio di smontare MediaWiki e incastrarlo in un database sembra eccessivo. Sto pensando che sarebbe molto più semplice eseguire il rollup del mio wiki in chiaro e archiviare questo file nel campo di testo appropriato del database.

È stato utile?

Soluzione

Quindi, in sostanza, questo è un "come posso informazioni sulla versione di testo nel mio DB".

Bene, il modo più semplice è semplicemente copiare i dati.

Semplicemente, crea una versione " " tabella che contiene "vecchie versioni" dei dati e collegarli alla tabella principale.

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
}

Ogni volta che si aggiorna il documento originale, si copia il vecchio valore di testo in questa tabella, si copia l'utente e si modifica la data e si esegue il bump della versione.

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;

Potresti anche farlo in un trigger se il tuo DB li supporta.

I difetti con questo metodo sono che è una copia completa dei dati (quindi se si dispone di un documento di grandi dimensioni, la versione rimane grande). Puoi mitigarlo usando qualcosa come diff (1) e patch (1).

Ad esempio:

diff version2.txt version1.txt > difffile

Quindi puoi memorizzare quel file come " versione 1 " ;.

Per recuperare la versione 1 dalla versione 2, prendi i dati della versione 2, esegui la patch su di essa usando i dati del file diff e questo ti dà v1.

Se vuoi passare da v3 a v1, devi farlo due volte (una volta per ottenere v2 e poi di nuovo per ottenere v1).

Questo riduce il carico di archiviazione, ma aumenta l'elaborazione (ovviamente), quindi dovrai giudicare come vuoi farlo.

Altri suggerimenti

L'enorme risposta di Will è corretta, ma può essere riassunta, penso: devi archiviare le versioni e quindi devi archiviare i metadati (chi cosa quando dei dati).

Ma la tua domanda riguardava le risorse sul versioning simile a Wiki. Non ne ho nessuna (beh, una: Risposta di Will sopra ). Tuttavia, per quanto riguarda l'archiviazione di Wiki, ne ho uno. Scopri la matrice di confronto di DokuWiki . Lo so. Stai pensando " a cosa mi importa quale marca di DB diversi Wiki usano? & Quot; Perché DokuWiki utilizza file di testo semplice. Puoi aprirli e sono davvero chiari. Quindi questo è un approccio, e hanno alcuni argomenti interessanti sul perché i DBMS non siano il modo migliore di procedere. Non contengono nemmeno molti metadati: la maggior parte delle cose viene fatta attraverso i file flat stessi.

Il punto di DokuWiki per te è che forse è un problema relativamente semplice (dipende da quanto bene vuoi risolverlo :)

Ecco un elenco di tutti i 12 wiki su WikiMatrix che sono scritti in PHP e fanno la loro memorizzazione usando file di testo. Forse uno di loro avrà un metodo di archiviazione che puoi adattare al database:

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

Sembra che tu stia essenzialmente cercando il controllo della versione. In tal caso, potresti voler esaminare un algoritmo diff.

Ecco la pagina Diff di Wikipedia.

Ho fatto una rapida ricerca con google php diff, ma nulla è stato davvero un buon esempio, dato che ho solo conoscenze di base di PHP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top