Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure Datomic的tempid是否提供唯一的实体id?_Clojure_Datomic_Datascript - Fatal编程技术网

Clojure Datomic的tempid是否提供唯一的实体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"}]) 顾名思义

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

它产生一些长值,而不是UUID字符串,long是64位的,这让我想到它的唯一性,在某个时候我可能会达到long的极限。相反,使用UUID会更加困难

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

@(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明白了,谢谢您的解释!