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:
- 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?
- 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.