Modelli per annullare in applicazioni multiutente su dati relazionali

3

Voglio creare un'applicazione web che consenta a più utenti di popolare in modo collaborativo il contenuto di un database relazionale abbastanza convenzionale. (Il database avrà uno schema fisso, che è noto in anticipo).

Riesco a vedere come definire lo schema per i tipi di oggetto, le relazioni e i vincoli di chiave esterna necessari (elementi, elementi come membri di categorie, collegamenti tra elementi e così via). Le operazioni CRUD di base per creare istanze e modificare oggetti non sono un problema.

Ma per la resilienza contro atti di vandalismo e errori, posso prevedere che sarà necessario avere funzionalità di annullamento / rollback, in modo che gli utenti a livello di moderatore possano annullare le modifiche apportate da altri utenti. Sto riscontrando dei problemi nel trovare un approccio adeguato da adottare per due prerequisiti funzionali fondamentali:

  1. Catturare tutte le modifiche al database risultanti da una richiesta iniziale dell'utente. Ad esempio, c'è una relazione molti-a-molti tra articoli e categorie. Pertanto, se una categoria viene cancellata (attivata da un utente che invia un modulo HTML), tutti i record della relazione articolo-categoria corrispondenti a quella categoria verranno eliminati a causa di vincoli di integrità referenziale sulla relazione molti-a-molti. Come posso registrare tutte le conseguenze a cascata di un'operazione iniziale, quindi è possibile annullarlo completamente in seguito?
  2. Come posso isolare le operazioni di annullamento in modo che un'azione errata da parte di un utente possa essere annullata senza dover anche annullare tutte le modifiche apportate apportate da altri utenti, tra l'azione errata e la recensione del moderatore?

Gli schemi di annullamento che ho visto descritti (ad esempio il pattern "Command") presuppongono tutti che ci sia una pila di comandi e le operazioni di annullamento siano sempre applicate in rigoroso ordine inverso dell'applicazione iniziale (nessun supporto per gli annullamenti fuori ordine ).

Esistono schemi standard per la gestione delle funzionalità di annullamento nei database relazionali che potrebbero aiutare a raggiungere questi due obiettivi? Al momento, sto cercando algoritmi e schemi generici che aiutano a risolvere i problemi sopra elencati, piuttosto che i dettagli specifici della piattaforma.

    
posta Hydrargyrum 06.08.2014 - 11:36
fonte

2 risposte

3

Quello che stai probabilmente cercando è uno schema come questo:

    DOCUMENT
       |
DOCUMENT_VERSION
       |
DOCUMENT_CATEGORY

Cioè, ogni entità ha una collezione VERSION ad essa associata. Quando si esegue una modifica, si memorizza l'intera nuova versione con un nuovo record della versione, lasciando intatto l'originale. Quindi puoi implementare una funzione diff per mostrare all'utente le differenze tra due versioni e una funzione rollback per rendere una versione precedente la nuova versione attiva.

Queste sono funzioni di base in molte applicazioni Web, in particolare i wiki. Se stai utilizzando ASP.NET, potresti prendere in considerazione il download e l'installazione di ScrewTurn Wiki e esaminare come gestisce il controllo delle versioni. È open source.

    
risposta data 06.08.2014 - 11:59
fonte
2

L'approccio che ho usato è una tabella di controllo che registra l'immagine precedente e cambia il tempo prima di ogni aggiornamento o cancellazione. Ogni tabella avrebbe la propria tabella di controllo, popolata da un trigger. Questo di solito è combinato con i campi di controllo che elencano il tempo di modifica e l'utente che apporta la modifica. I campi di controllo devono essere compilati da trigger per impedire lo spoofing.

Supponendo che sia stato utilizzato un singolo userid per atti di vandalismo, questo sistema dovrebbe consentire di identificare rapidamente i record potenzialmente vandalizzati.

Per poter annullare le modifiche, utilizzerai un browser cronologico, che consente di sostituire un record con una versione precedente.

A seconda delle tue esigenze, potresti anche volere un backup del database che ti permetta di eseguire il recupero puntuale. Ciò ti consentirebbe di ripristinare rapidamente il punto prima dell'inizio del vandalismo.

    
risposta data 06.08.2014 - 14:15
fonte

Leggi altre domande sui tag