Clojure Datomic的tempid是否提供唯一的实体id?
我对提供实体id的datomic.api/tempid fn有一些疑问 它产生一些长值,而不是UUID字符串,long是64位的,这让我想到它的唯一性,在某个时候我可能会达到long的极限。相反,使用UUID会更加困难 当我编写这样的代码时,我会问自己,这是否达到了实体id限制,并在添加新实体时导致问题Clojure Datomic的tempid是否提供唯一的实体id?,clojure,datomic,datascript,Clojure,Datomic,Datascript,我对提供实体id的datomic.api/tempid fn有一些疑问 它产生一些长值,而不是UUID字符串,long是64位的,这让我想到它的唯一性,在某个时候我可能会达到long的极限。相反,使用UUID会更加困难 当我编写这样的代码时,我会问自己,这是否达到了实体id限制,并在添加新实体时导致问题 @(d/transact conn [{:db/id (d/tempid :db.part/user) :city/district "BEYKOZ"}]) 顾名思义
@(d/transact
conn
[{:db/id (d/tempid :db.part/user)
:city/district "BEYKOZ"}])
顾名思义,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
tempid还允许我们通过transact的返回值查找这些永久id,方法是查看temp id到永久id的映射。e、 g
(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开始,您不需要手动将tempid添加到新记录中,只需将:db/id保留在映射之外,还可以使用字符串作为tempid。例如,我们可以将city事务重写为:
@(d/transact
conn
[[:db/add "beykoz" :city/district "BEYKOZ"]
[:db/add "beykoz" :city/population 220364]])
顾名思义,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
tempid还允许我们通过transact的返回值查找这些永久id,方法是查看temp id到永久id的映射。e、 g
(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开始,您不需要手动将tempid添加到新记录中,只需将:db/id保留在映射之外,还可以使用字符串作为tempid。例如,我们可以将city事务重写为:
@(d/transact
conn
[[:db/add "beykoz" :city/district "BEYKOZ"]
[:db/add "beykoz" :city/population 220364]])
如果我在不同的事务中添加的val超过2^64:city/district,我仍然会超过entityId,对吗?因为我将有超过2^64:city/district的条目,而DB将无法找到新的长值?基于,我认为您大致正确。听起来实体的最大数量实际上大约是2^42。但请记住,这些只是实体限制,在你开始达到限制之前,你可以有很多关于这些实体的事实。这是很多地区!如果你有2^64个唯一的:城市/地区,那么你的总数据集很可能是这个星球上最大的单一数据集,并且是其中的一部分。这不适合Datomic。无论您选择什么数据库,请务必密切关注您的数据库。@StuartDabbsHalloway明白了,谢谢您的解释!如果我在不同的事务中添加的val超过2^64:city/district,我仍然会超过entityId,对吗?因为我将有超过2^64:city/district的条目,而DB将无法找到新的长值?基于,我认为您大致正确。听起来实体的最大数量实际上大约是2^42。但请记住,这些只是实体限制,在你开始达到限制之前,你可以有很多关于这些实体的事实。这是很多地区!如果你有2^64个唯一的:城市/地区,那么你的总数据集很可能是这个星球上最大的单一数据集,并且是其中的一部分。这不适合Datomic。无论您选择什么数据库,请务必密切关注您的数据库。@StuartDabbsHalloway明白了,谢谢您的解释!