Panoramica
Penso che tu possa risolvere il tuo problema in un processo in 3 fasi relativamente semplice:
-
Dato due istantanee (consecutive) dello stato delle tue entità, determina le modifiche tra loro.
-
Ripeti questo passaggio fino a quando tutte le istantanee (disponibili) vengono elaborate e memorizza le modifiche da qualche parte.
-
Interroga le modifiche memorizzate per qualcosa che ti interessa.
Ricerca delle modifiche
Molto probabilmente creerò una tabella hash per la prima istantanea. Ci sono alcune opzioni qui:
-
Utilizza Id
per mappare una struttura dati che contiene i valori della tua entità
-
Utilizza una tupla (Id, AttributeName)
come chiave per mappare direttamente i valori. A seconda della lingua, potrebbe avere senso solo se tutti i valori sono dello stesso tipo.
-
Fai lo stesso di sopra, ma usa una tabella hash per ogni tipo di attributo.
Ora trasformi la seconda istantanea in una tabella hash e la confronta con la prima. Quando hai trovato e memorizzato tutte le modifiche, scarti la prima tabella di hash (ma mantieni la seconda) e ripeti questa procedura con le istantanee due e tre - e così via ...
Memorizzazione delle modifiche
Ogni modifica che trovi può essere rappresentata da una tupla come (Time, EntityId, AttributeName, OldValue, NewValue)
. A seconda di cosa desideri eseguire la query, potresti non aver bisogno di tutti questi campi.
Una volta trovata una modifica, la domanda diventa dove archiviarli. Un database sembra la soluzione ideale. Se si dispone di memoria sufficiente e non si desidera mantenere le modifiche, è possibile utilizzare un DB in memoria.
Il database fornirà tutte le funzionalità per rendere le query facili ed efficienti. In particolare, avrai un linguaggio di query consolidato e puoi creare gli indici pertinenti.
Entità aggiunte e rimosse
Se l'insieme delle entità monitorate rimane costante, puoi trovare tutte le differenze semplicemente ripetendo le chiavi di una tabella hash e confrontando i valori della chiave in entrambe le tabelle.
Tuttavia, quando le entità possono essere aggiunte e rimosse, può essere utile trattare ogni caso (aggiunto, modificato, rimosso) separatamente.
-
È possibile trovare facilmente entità aggiunte durante la creazione della nuova tabella hash. Controlla semplicemente se l'entità esisteva già in quella precedente.
-
Le entità rimosse possono essere trovate insieme alle entità modificate mentre si scorre sulle entità nella vecchia tabella.
In alternativa, puoi ovviamente utilizzare le operazioni intersect / complement nei tuoi set di chiavi.