2017-03-17 62 views
1

我对datomic.api/tempid fn提供了实体ID有一些疑问。Datomic的tempid是否提供唯一的实体ID?

它产生一些long价值,而不是UUID Stringlong是64位,它让我想想的独特性后,某些时候,我可能会达到长的限制。取而代之的是UUID会更难。

当我写一些像这样的代码,我问自己“这是否达到实体ID的限制,并增加新的实体时,造成的问题吗?”

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

回答

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直到我们从数据库中往返。

Tempids也让我们的方式通过的transact返回值来找到这些永久性标识,通过查看地图一个临时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]]) 
+0

如果我添加超过2^64:随时间不同的交易城市/地区“一些-VAL”,我依然会超出因此,例如,我们可以为改写城市交易entityId对吗?因为我将有超过2^64:城市/地区条目,数据库将无法找到新的长期价值? –

+0

根据[此邮件列表讨论](https://groups.google.com/forum/#!topic/datomic/s0u3vjb0GG4),我认为你是正确的。这听起来像实体的最大数量实际上是大约2^42。但请记住,这些仅仅是实体限制,并且在开始达到限制之前,您可以获得关于这些实体的大量*事实*。 – camdez

+3

这是很多地区!如果你有2^64个独特的城市/地区,那么你的总数据集可能是[zettabyte-sized](https://en.wikipedia.org/wiki/Zetta-),这可能是你的地球上最大的单一数据集,和[这个星球上的所有数据]的一小部分(http://www.computerweekly.com/news/2240217788/Data-set-to-grow-10-fold-by-2020-as-internet-of-things -起飞)。这对Datomic来说不太适合。无论您选择哪种数据库,请务必密切关注您的[存储成本](http://gizmodo.com/5557676/how-much-money-would-a-yottabyte-hard-drive-cost)。 –