Ert*_*tin 1 clojure datomic datascript
我对datomic.api/tempid
提供实体ID的fn 有一些疑问.
它产生了一些long
价值,不UUID String
和long
是64位,它让我想想的独特性后,某些时候,我可能会达到长的限制.反而会更难UUID
.
当我写这样的代码时,我会问自己"这是否达到实体ID限制并在添加新实体时导致问题?"
@(d/transact
conn
[{:db/id (d/tempid :db.part/user)
:city/district "BEYKOZ"}])
Run Code Online (Sandbox Code Playgroud)
顾名思义,tempid
只提供临时标识; 这些将在单个事务的上下文中使用.因此,除非您在单个事务中超过2 ^ 64个新记录,否则您将不会用完ID,并且这种事务无论如何都要太大而无法运行.
tempid的主要目的是允许我们在事务中的多个位置引用新创建的实体.
事实上,基于地图的交易格式是基于矢量的格式的简写; 如果我们想在内部创建一个具有几个属性的城市,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]]))
Run Code Online (Sandbox Code Playgroud)
...只能使用某种共享标识符,但在我们从数据库中往返之前,我们不知道永久插入ID.
Tempids还允许我们transact
通过查看临时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))
Run Code Online (Sandbox Code Playgroud)
值得注意的是,从Datomic 0.9.5530开始,您不需要手动将tempid添加到新记录中(只需将其留:db/id
在地图外),您也可以使用字符串作为tempid.因此,例如,我们可以将城市交易重写为:
@(d/transact
conn
[[:db/add "beykoz" :city/district "BEYKOZ"]
[:db/add "beykoz" :city/population 220364]])
Run Code Online (Sandbox Code Playgroud)