2014-07-09 30 views

Odpowiedz

12

Czas ma fundamentalne znaczenie dla projektu Datomica. Częścią czasu Datomica jest to, że jednostki nie są tworzone lub aktualizowane tak, jak w tradycyjnej bazie danych CRUD, gdzie wiersz jest wstawiany do tabel, a nowe fakty zastępują stare fakty w wierszu. Zamiast tego fakty dotyczące podmiotów są potwierdzane i wycofywane w miarę upływu czasu. Biorąc pod uwagę niezmienną historię, Datomic wie, jak to się stało w obecnym stanie. Można zebrać te informacje na temat struktury danych z czasem bazę Historia:

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

więc odpowiedzieć na pytanie o dodanej na i aktualizowana-u, na której można polegać Datomic wbudowanego w świadomości czasu . Do sprawdzania, kiedy rzeczy zostały stworzone - tutaj są dwie opcje. Jeśli schemat zawiera unikalny identyfikator pewnego rodzaju, można ograniczyć zapytanie odnosi się do transakcji, gdy atrybut ten został utworzony (powinny być raz, gdy jednostka po raz pierwszy dodane):

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

jeśli można” t polegać na atrybut przy inicjalizacji, można użyć bazy historii podjąć minimalny czas dla wszystkich transakcji odpowiadających jednostce, tak jak w tym zapytania parametrycznego:

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

Należy zauważyć, że w ten sposób będzie wolniejszy, ale potencjalnie bardziej solidne. Jeśli chcesz potwierdzić ostatni fakt ("aktualizacja"), możesz sub max dla min.

+0

dziękuję za odpowiedź, jednak w ten sposób trudno mi było to zrobić. Czy to jest performatyczne? Zwłaszcza w przypadku znalezienia czasu "aktualizacji"? Czy sądzisz, że można utworzyć atrybut "created-at" i "update-at" lub byłoby to marnowanie? Jeśli chcę zamówić w czasie tworzenia, np. Jest to łatwe? I dlaczego nie użyłeś "(history db)" w pierwszym stwierdzeniu? Nie dostałem tego. Dziękuję bardzo. –

+0

Niepotrzebne i nieco odwrotne do zdefiniowania tych atrybutów jest sam *, chyba że * odpowiadają wymiarowi czasowemu poza Datomic (Datomic posiadający zarejestrowane czasy dla twierdzeń o faktach). Indeks dziennika Datomic (zobacz Log API http://docs.datomic.com/log.html) jest zoptymalizowany dla tego typu zapytań opartych na czasie transakcji. –

+0

Możesz również znaleźć sekcję dotyczącą proweniencji z dziennej bazy danych: https://github.com/Datomic/day-of-datomic/blob/master/tutorial/provenance.clj –