In realtà hai due problemi:
- Devi implementare un meccanismo di rollback
- Devi memorizzare ogni modifica nel database
Questi richiedono due soluzioni diverse.
Se hai una tradizionale applicazione web con i POST di nuovo sul server per modificare i dati, allora il pattern di Memento non è proprio appropriato qui. Hai solo bisogno di un modo per archiviare revisioni ai record in più tabelle in un database.
Dato che stai intrattenendo il Memento Pattern, assumerò che ci sia un cliente più ricco di una semplice pagina web e un modulo.
Il Memento Pattern si prenderà cura delle modifiche allo stato dell'applicazione in memoria. La persistenza e la possibilità di ripristinare le modifiche dalla persistenza dovrebbero essere una logica separata. Quindi il tuo primo ordine del giorno è quello di implementare il Memento Pattern senza persistenza. Successivamente è necessario un modello dati che consenta la revisione dei record in un database.
Supponiamo che tu abbia un'applicazione per il blog e che tu debba salvare le revisioni su un post del blog. Avrai bisogno di due tabelle:
- blogposts
- BlogPostRevisions
La tabella BlogPosts sarebbe in realtà solo una chiave primaria glorificata e una chiave esterna per la tabella delle revisioni post del blog:
+------------------------+
| BlogPosts | +-------------------+
+------------------------+ | BlogPostRevisions |
| (PK) Id | +-------------------+
| (FK) CurrentRevisionId | -|------< | (PK) RevisionId |
+------------------------+ | Title |
| Body |
| PublishDate |
| CreateDate |
+-------------------+
La creazione di un post sul blog crea 2 record su due diverse tabelle:
- Un record nella tabella BlogPosts
- Un record nella tabella BlogPostRevisions
Un aggiornamento al post del blog inserisce un nuovo record nella tabella BlogPostRevisions con tutti i valori correnti (e modificati di recente) per il post del blog. La colonna CurrentRevisionId nella tabella BlogPosts viene aggiornata con il nuovo ID revisione.
Il rollback di una revisione precedente è semplice come cambiare CurrentRevisionId, o semplicemente copiare una revisione esistente e inserirla come revisione più recente.
In breve, mantenere il meccanismo di annullamento della memoria in memoria (annulla) diverso dal meccanismo di rollback persistente. Il pattern Memento non affronta la persistenza e la persistenza non rende necessariamente il meccanismo di "annullamento" più intuitivo e reattivo. Hai due problemi che meritano due soluzioni diverse.