顾名思义,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]])