Использовать время события вместо времени транзакции в Datomic?

Фон

Я использую Datomic для хранения проекций событий, сгенерированных другими системами (проекции в этом случае можно рассматривать как сущность в Datomic). Эти события имеют связанную с ними отметку времени, которая сообщает, когда событие было (например) создано. Очевидно, что это не то же самое, что время транзакции, которое Datomic назначит транзакции при сохранении нового атрибута (на основе события) в проекции. Пользователей моего приложения интересует не время транзакции, а время события. Причина, по которой я использую Datomic, в первую очередь заключается в том, чтобы иметь возможность получить сущность (или запросить базу данных) в определенное время. Однако это время должно быть не временем транзакции Datomic, а скорее временем события. Например, я хочу получить объект на основе этого времени события:

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

Возможное решение

Одна идея, о которой я думаю, состоит в том, чтобы установить :db/txInstant для каждой транзакции на время события, но мне посоветовали не сделать это как общий принцип. Другая потенциальная проблема заключается в том, что вы не можете назначить :db/txInstant старше схемы (что будет иметь место в моем приложении). Решением этой проблемы было бы установить действительно раннее :db/txInstant для транзакции, создающей схему.

Вопрос

Как в Datomic обычно обрабатывают время события, а не время транзакции? Как работает «возможное решение»?


person Johan    schedule 02.09.2016    source источник


Ответы (1)


Как правило, время транзакции Datomic (t) предназначено для записи момента, когда система узнала о факте, а не доменного времени факта.

Если вам нужно обрабатывать доменное время (то есть время, когда что-то произошло в «реальном мире» или время события в вашем примере), я настоятельно рекомендую явно моделировать доменное время с помощью атрибута (вы можете использовать атрибут типа :db.type/instant ). Это позволит вам устанавливать даты без каких-либо ограничений, а также запрашивать как время домена, так и системное время отдельно для таких вопросов, как «когда произошло X И когда моя база данных узнала о том, что X произошло?».

person Marshall    schedule 06.09.2016
comment
Звучит разумно, но как я могу, например, получить объект в определенное время события, если я это сделаю? - person Johan; 06.09.2016
comment
Чтобы уточнить, я имею в виду, что меня интересует, как выглядит база данных в определенный момент, и этот момент должен быть временем события, а не временем обработки/транзакции Datomic. - person Johan; 06.09.2016
comment
Вы можете использовать (d/as-of db date), чтобы получить представление базы данных в date, где дата — это java.util.Date (это то, к чему разрешается :db.type/instant) - person ChrisBlom; 11.06.2018