Design appropriato per il ripristino degli stati precedenti

1

Questa è una caratteristica molto comune nel software, e sono sicuro che c'è un intero accordo scritto, ma non so davvero quale sia il termine tecnico, quindi eccomi qui:

Sto parlando di dare al tuo servizio o prodotto la possibilità di salvare lo stato di alcuni dati per poterli accedere in futuro e le modifiche al rollback. Ciò creerebbe una cronologia delle modifiche e una raccolta di stati o backup salvati (anche se non necessariamente utilizzati come backup, proprio come una funzione di azione "annulla").

Lo scenario avrebbe una funzionalità che interagisce con più oggetti e vogliamo salvare lo stato che hanno in quel momento specifico in modo da poter eseguire il rollback a quel punto in qualsiasi momento.

Punti da considerare:

  • gli oggetti sono di tipi diversi e possono essere correlati tra loro

  • non tutte le informazioni contenute in un oggetto sono necessariamente rilevanti quando si tratta di salvare il suo stato. Ad esempio, quando si salva lo stato di Beach cose come temperature o time sono rilevanti ma location non lo è (la spiaggia non va da nessuna parte).

  • dovremmo decidere il livello di dettaglio dell'azione di salvataggio. Andando per piccoli cambiamenti creerebbe un grande sovraccarico. Ma andare per cambiamenti più grandi ridurrebbe il livello di dettaglio a cui il sistema si applicherebbe, naturalmente. Preferirei quest'ultimo però.

Come dovrei avvicinarmi a questo?

  • quale sarebbe il design appropriato per il sistema di salvataggio dello stato?

  • quale sarebbe il design appropriato per il sistema di ripristino dello stato?

  • quale sarebbe un adeguato sistema di persistenza? Vai con il tuo database come al solito? O forse serializzare i dati e salvarli come file binario? (Immagino che questa sia una cattiva idea)

Sull'ultimo punto: se dovessimo usare il database (il 99% è sicuro che sarebbe la soluzione giusta) utilizzeremmo le stesse tabelle o creare quelle dedicate per il sistema di restauro? Posso vedere pro e contro su entrambe le decisioni.

    
posta dabadaba 27.09.2018 - 16:34
fonte

2 risposte

2

A livello di database il termine tecnico sarebbe "transazione". Ma questo non è inteso per le funzionalità a livello di applicazione, e dovrebbe essere utilizzato solo per il rollback in caso di errori.

Per uno scenario complesso potresti voler seguire un layout di database che segue i principi di Dimensioni a variazione lenta

Se sei libero nella scelta della tua tecnologia e hai del tempo a disposizione puoi consultare Datomic che è un database integrato Clojure, che tra le altre caratteristiche fornisce una cronologia completa, che rende relativamente facile implementare funzionalità "Undo".

Un'altra cosa da dare un'occhiata potrebbe essere Event Sourcing - un modello di progettazione che può in qualsiasi momento ricostruire l'attuale stato ripetendo gli eventi.

    
risposta data 27.09.2018 - 17:35
fonte
0

Per i casi meno complessi (come una singola tabella), uno avrebbe la tabella principale che memorizza il / i record corrente / i, e quindi una tabella separata che memorizza tutti i record storici con un FK nei record correnti delle tabelle principali. È facile aggiornare la corrente e memorizzare un nuovo record in storico.

Per sceanarios complessi (molti oggetti e relazioni), è possibile utilizzare l'intero stato in qualche modo (JSON, XML, Binary, ecc.). In questo caso, è necessario un solo record per la memorizzazione poiché quel record memorizza l'intera struttura di dati che include relazioni dati primarie e secondarie. Per ripristinare, basta applicare i dati alle tabelle secondo necessità e memorizzare un nuovo blob del nuovo stato.

Non conosco i tuoi requisiti esatti ma ho visto entrambi i metodi utilizzati in passato.

    
risposta data 27.09.2018 - 17:16
fonte

Leggi altre domande sui tag