1

datomic.api/tempid我对提供实体 ID 的 fn有一些疑问。

它产生了一些long价值,而不是UUID String64long位,这让我在某个点可能达到 long 的极限后思考它的独特性。相反,它会更难UUID

当我写一些这样的代码时,我问自己“这是否达到了实体 id 限制并在添加新实体时导致问题?”

@(d/transact
   conn
   [{:db/id   (d/tempid :db.part/user)
     :city/district "BEYKOZ"}])
4

1 回答 1

8

顾名思义,tempid只提供一个临时标识符;这些将在单个事务的上下文中使用。因此,除非您在单个事务中超过 2^64 条新记录,否则您不会用完 ID — 而且这种事务将太大而无法运行。

tempids 的主要目的是允许我们在事务中的多个位置引用新创建的实体。

实际上,基于地图的交易格式是基于向量的格式的简写;如果我们想创建一个具有几个属性的城市,在内部,Datomic 正在做一些类似的事情:

@(d/transact
   conn
   (let [city-id (d/tempid :db.part/user)]
     [[:db/add city-id :city/district "BEYKOZ"]
      [:db/add city-id :city/population 220364]]))

...这只能通过某种共享标识符实现,但在我们从数据库往返之前,我们不知道永久的插入 ID。

transact临时 ID 还允许我们通过查看临时 ID 到永久 ID 的映射,通过 的返回值找到这些永久ID。例如

(let [tempid (d/tempid :db.part/user)
      tx     [{:db/id tempid, :city/district "BEYKOZ"}]
      result @(d/transact conn tx)]
  (d/resolve-tempid (:db-after result) (:tempids result) tempid))

还值得注意的是,从 Datomic 0.9.5530 开始,您不需要手动将 tempids 添加到新记录中(只需将其:db/id排除在地图之外),您还可以使用字符串作为 tempids。因此,例如,我们可以将城市事务重写为:

@(d/transact
   conn
   [[:db/add "beykoz" :city/district "BEYKOZ"]
    [:db/add "beykoz" :city/population 220364]])
于 2017-03-17T16:40:29.307 回答