2014-07-09 15 views

risposta

12

Il tempo è fondamentale per il design di Datomic. Parte della visione del tempo di Datomic è che le entità non vengono create o aggiornate come in un database CRUD tradizionale in cui le righe vengono inserite nelle tabelle e nuovi fatti sovrascrivono i fatti precedenti nella riga. Invece, i fatti sulle entità sono affermati e ritrattati nel tempo. Data questa storia immutabile, Datomic sa come deve essere nel suo stato attuale. È possibile raccogliere queste informazioni sulla struttura dei vostri dati nel tempo il database della cronologia:

http://docs.datomic.com/clojure/#datomic.api/history

Quindi per rispondere alla tua domanda su aggiunto-a e aggiornato-in, si può contare su Datomic di built-in di sensibilizzazione tempo . Per interrogare su quando sono state create le cose - qui ci sono due opzioni. Se lo schema include un identificatore univoco di qualche tipo, è possibile vincolare la query per fare riferimento alla transazione quando questo attributo è stato creato (dovrebbe essere una volta, quando l'entità è stato aggiunto prima):

(d/q '[:find ?e ?tx-time 
     :where 
     [?e :user/id _ ?tx] 
     [?tx :db/txInstant ?tx-time]] 
    db) 

Se si puo' t si basano su un attributo in fase di inizializzazione, è possibile utilizzare un database della cronologia di prendere il tempo minimo per tutte le transazioni corrispondenti ad un'entità, come ad esempio in questa query con parametri:

(d/q ':find ?e (min ?tx-time) 
     :in $ ?e 
     :where 
     [?e _ _ ?tx _] 
     [?tx :db/txInstant ?tx-time] 
    (history db) entity-id) 

si noti che in questo modo sarà più lento, ma potenzialmente più robusto. Se si desiderava l'ultimo fatto affermato ("aggiornamento"), è possibile sub max per min.

+0

grazie per la risposta, tuttavia ho trovato difficile fare in questo modo. È così performante? Specialmente nel caso di trovare il tempo di "aggiornamento"? Pensi che sia giusto creare un attributo "creato-a" e "aggiornamento-at" o sarebbe uno spreco? Se voglio ordinare per tempo di creazione, ad esempio, è così facile? E perché non hai usato "(storia db)" nella prima affermazione? Non l'ho capito Grazie mille. –

+0

Non è necessario e in qualche modo controproducente definire questi attributi * a meno che * non corrispondano a una dimensione temporale esterna a Datomic (Datomic che ha registrato i tempi per le asserzioni sui fatti). L'indice di registro di Datomic (consultare l'API Log http://docs.datomic.com/log.html) è ottimizzato per questi tipi di query basate sul tempo di transazione. –

+0

Puoi anche trovare la sezione di provenienza dal giorno del datomico utile: https://github.com/Datomic/day-of-datomic/blob/master/tutorial/provenance.clj –

Problemi correlati