如何在Datomic中表示具有现有UUID的实体?

时间:2016-08-09 18:15:01

标签: clojure datomic

背景

我们有多个通过事件进行通信的服务。许多事件指的是使用事件中存在的(全局)唯一代理id的某个实体。例如,“CustomerRegisteredEvent”(E)可以包含注册客户的id。当使用其他数据库时,我通常可以持有“Customer”实体,其id与(E)中存在的id(和其他值)对应。

在datomic中,我通常会看到使用tempid为新实体生成一个id,但是我不清楚我是否应该在事先知道UUID时使用这种方法?

问题

  1. 有没有办法根据事件中的id生成Datomic id?
  2. 如果没有,是否通常只为“原始”(事件)ID创建新属性?类似的东西:

    {:db/id #db/id[:db.part/db] :db/ident :customer/uuid :db/valueType :db.type/string :db/cardinality :db.cardinality/one :db/doc "The original UUID of the customer" :db.install/_attribute :db.part/db}

1 个答案:

答案 0 :(得分:2)

只需忽略Datomic :db/id作为内部细节(就像忽略提交的Git哈希作为内部细节)。在您的问题中使用解决方案(2),除了您可能想要使用内置类型:db.type/uuid而不是字符串。

您可能也有兴趣查看the Tupelo-Datomic library,其中包含许多辅助功能和便捷功能,可与Datomic进行交互。

享受!

P.S。不要忽略用于生成半序列UUID的Datomic函数d/squuid,这是在Datomic中生成 new UUID的更有效方法

更新:向Datomic添加数据有点令人困惑,并且比它需要的更复杂。这就是为什么你可以使用Tupelo-Datomic简化整个操作的原因:

(td/transact *conn*
  (td/new-entity { :person/name "James Bond" :location "London"     :weapon/type #{ :weapon/gun :weapon/wit   } } )
  (td/new-entity { :person/name "M"          :location "London"     :weapon/type #{ :weapon/gun :weapon/guile } } )
  (td/new-entity { :person/name "Dr No"      :location "Caribbean"  :weapon/type    :weapon/gun                 } ))

Tupelo-Datomic为您做的一件事就是默默地添加样板:{:db/id (d/tempid -partition) }