2016-09-02 26 views
3

背景在Datomic中使用事件時間而不是事務時間?

我使用Datomic存儲由其它系統產生的事件的凸起(在此情況下的預測可以被視爲在一個Datomic實體)。這些事件有一個與它們相關的時間戳,告訴事件何時(例如)創建。這顯然不同於Datomic在投影中存儲新屬性(基於事件)時將分配給事務的事務時間。我的應用程序的用戶對交易時間不感興趣,而是對事件時間感興趣。我之所以首先使用Datomic,是爲了能夠在特定時間獲取實體(或查詢數據庫)。但是這次應該是而不是是Datomic交易時間,而是事件時間。例如,我希望能夠在此基礎上事件時間獲得一個實體:

(datomic/entity (datomic/as-of db event-time) id) 

可能的解決方案,我想的

一個想法是設定:db/txInstant每筆交易的事件發生的時間,但我一直在做advised這不是一般原則。此問題的另一個潛在問題是,您不能分配比模式更舊的:db/txInstant(在我的應用程序中,將是)。解決這個問題的方法是將創建模式的事務設置爲早期的:db/txInstant

問題

怎樣一個典型的處理事件的時間,而不是交易時間Datomic? 「可能的解決方案」如何維持?

回答

1

一般來說,Datomic的交易時間(t)用於記錄系統何時發現事實,而不是事實的域時間。

如果你需要處理域名時間(例如,在'真實世界'中發生的事情,或者在你的例子中發生的事件時間),我強烈建議用一個屬性明確地建模域時間(你可以使用屬性類型:db.type/instant)。這將允許你設置日期沒有任何限制,以及分別查詢域時間和系統時間的問題,如「X何時發生,我的數據庫何時發現X發生?」。

+0

聽起來很合理,但是如果我這樣做,我怎麼能在特定的事件時間獲得實體? – Johan

+0

爲了闡明我的意思,我對數據庫在特定時刻的外觀如何感興趣,此時應該是事件時間而不是Datomic處理/交易時間。 – Johan