Datomic的tempid是否提供唯一的实体ID?
问题描述:
我对datomic.api/tempid
fn提供了实体ID有一些疑问。Datomic的tempid是否提供唯一的实体ID?
它产生一些long
价值,而不是UUID String
和long
是64位,它让我想想的独特性后,某些时候,我可能会达到长的限制。取而代之的是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直到我们从数据库中往返。
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]])
如果我添加超过2^64:随时间不同的交易城市/地区“一些-VAL”,我依然会超出因此,例如,我们可以为改写城市交易entityId对吗?因为我将有超过2^64:城市/地区条目,数据库将无法找到新的长期价值? –
根据[此邮件列表讨论](https://groups.google.com/forum/#!topic/datomic/s0u3vjb0GG4),我认为你是正确的。这听起来像实体的最大数量实际上是大约2^42。但请记住,这些仅仅是实体限制,并且在开始达到限制之前,您可以获得关于这些实体的大量*事实*。 – camdez
这是很多地区!如果你有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)。 –