2013-03-14 16 views
10

Dopo aver letto un sacco di domande SO su Keeping page changes history o How to version control a record in a database (ad esempio), non riesco a trovare una soluzione elegante per fare il lavoro.Come creare un sistema di versioning/storia/revisione per i contenuti pubblicati dagli utenti?

Ora, proviamo a spiegare il più chiaro possibile ciò che ci serve, per questo semplice sistema di revisione, che permette agli utenti registrati di pubblicare alcuni articoli, e gli altri utenti di presentare una revisione di tali articoli, e poi alcuni moderatori gli utenti di controllare quelle revisioni.

database MySQL

Il database contiene una tabella articoli con i seguenti campi semplificate:

ARTICLE(id, id_user, title, content, date); 

Per implementare le versioni revisione/storia, credo che avremo la seguente tabella:

REVISION(id, id_article, revision_id_user, id_moderator, revision_date, 
     revision_title, revision_content, revision_description, revision_check); 

Con la relazione: ARTICLE 0,n <---> 1,1 REVISION

012.

Workflow

  • Un utente crea un ARTICLE, goduto è inserito nella ARTICLE tabella (eccezionale!)

  • altro utente fa un aggiornamento di questa ARTICLE, questo aggiornamento è registrato nella tabella REVISION, e accodato per gli utenti moderatore. (revision_check=0).

  • Un utente moderatore convalida lo REVISION(revision_check=1), quindi lo ARTICLE(content) ottiene il valore REVISION(revision_content).

Le mie domande

  • È questo il flusso di lavoro sembra essere un buon modo per farlo? Perché, io vedo un errore: se ci sono diversi REVISION s per un ARTICLE:

    • Dovremmo prendere il contenuto dell'ultima submited REVISION o l'originale ARTICLE?
    • Oppure, dovremmo bloccare le revisioni in quanto non è possibile inviare altri REVISION mentre l'ultimo non è selezionato.
  • C'è un modo per registrare il controllo della luce? A proposito, è possibile inserire nella tabella REVISION, solo il contenuto aggiornato tramite una funzione di confronto SQL, PHP o js? E come visualizzarlo come SO farlo? Perché temo che la tabella REVISION sarà molto pesante.

  • Bonus: come si fa ??

Qualsiasi idea, collegamento, fonte, plug (MySQL, PHP 5 e JS/Jquery) sarebbe molto appriciated.

risposta

7

Non vedo una risposta singola con un plug-in per la tua domanda, a causa del tuo flusso di lavoro personalizzato.

sul flusso di lavoro di revisione

E 'la vostra visione di esso, non sembra troppo male per il vostro uso. Ma sono sicuro che alcuni casi d'uso dovrebbero evolversi a proposito.

Primo punto che posso vedere, è necessario bloccare le revisioni finché non è in corso una revisione E finché non viene convalidata da un moderatore. Quando è in corso, ad esempio, aggiungi ARTICLE(revision=progress) per bloccarlo ed evitare che gli utenti modifichino un articolo contemporaneamente visualizzando un messaggio.

Secondo punto, attenzione, credo che l'autore dell'articolo potrebbe aggiornarlo senza alcun processo di moderazione. Per questo motivo, dovrai impostare anche lo ARTICLE(revision=progress), mentre l'autore aggiorna il suo articolo.

A proposito di registrazione di una versione leggera delle revisioni in dB

Si potrebbe fare una funzione di folle in php (o altro), che crea un array, per ogni cambiamento, come il seguente:

array('1'=>array('char_pos'=>'250','type'=>'delete','length'=>'25','change'=>''), 
'2'=>array('char_pos'=>'450','type'=>'insert','length'=>'16','change'=>'some text change'), 
...); 

Come potete vedere, la creazione, la creazione e la registrazione di questo database possono essere molto interessanti e difficili da gestire.

Penso che non ci sia modo di fare il versioning con MySQL. Potresti fare qualcosa per il versioning con un ORM come PROPEL ma non penso che il risultato sarà quello che ti aspetti ...

Qui, il modo migliore sembra registrare l'intero articolo aggiornato per ogni revisione, anche se cresce il tuo database. Con il tuo flusso di lavoro non leggerete molto la tabella REVISION, quindi MySQL non avrà un carico pesante per questo.

Informazioni sulla visualizzazione confronto

È possibile utilizzare il Diff-Match-Patch plugin per HiLight gli aggiornamenti tra i due contenuti, "differences" demo here. Penso che SO usi Beyond compare (o simili) per le variazioni di crepuscolo tra le revisioni.

Per ulteriori informazioni sulle tecnologie SO, è possibile dare un'occhiata a this page.

+0

+1 Grazie mille per i vostri consigli e per i collegamenti. Aspettando i punti di vista degli altri membri, e se non c'è, controllerò la tua risposta. – Valky

Problemi correlati