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-需要显式手动编码唯一ID?_Clojure_Datomic - Fatal编程技术网

Clojure Datomic-需要显式手动编码唯一ID?

Clojure Datomic-需要显式手动编码唯一ID?,clojure,datomic,Clojure,Datomic,我的问题是-Dataomic是否需要最终用户显式手动创建唯一序列号?还是仅仅是提供的示例 我正在阅读Datomic教程 当我查看seattle-data0.dtm中加载的数据时,我在前两行看到: [ {:district/region :region/e, :db/id #db/id[:db.part/user -1000001], :district/name "East"} {:db/id #db/id[:db.part/user -1000002], :neighborhood/name

我的问题是-Dataomic是否需要最终用户显式手动创建唯一序列号?还是仅仅是提供的示例

我正在阅读Datomic教程

当我查看seattle-data0.dtm中加载的数据时,我在前两行看到:

[
{:district/region :region/e, :db/id #db/id[:db.part/user -1000001], :district/name "East"}
{:db/id #db/id[:db.part/user -1000002], :neighborhood/name "Capitol Hill", :neighborhood/district #db/id[:db.part/user -1000001]}
请特别注意这些值

:db/id #db/id[:db.part/user -1000001],
:db/id #db/id[:db.part/user -1000002]
#db/id[:db.part/user -1000001]
也许您可以帮助我理解—在准备插入数据时,这似乎明确要求手动生成唯一的ID序列号

当然,在现代数据库中,我们可以依靠数据库为我们生成序列号吗


当我去做我自己的示例模式和数据插入时,我发现我也需要插入手动ID号。我遗漏了什么?

回答您的问题:没有Datomic不要求最终用户生成标识符。你在西雅图的例子中看到的是

每次您想向Datomic添加有关新实体的事实时,您必须为每个新实体提供一个临时id。Datomic将用一个真正唯一的id替换该id

现在,您可能会问自己,为什么必须首先使用这个临时ID?需要临时ID来表示单个事务中所有新实体之间的关系。在您的示例中,您有以下ID:

:db/id #db/id[:db.part/user -1000001],
:db/id #db/id[:db.part/user -1000002]
#db/id[:db.part/user -1000001]
其中两个是相同的(稍后我将解释负数)。这意味着用临时id
#db/id[:db.part/user-1000001]
标记的新实体在这两个方面是相同的

现在我必须解释
#db/id[:db.part/user-1000001]
#db/id
是Datomic临时id的标记。标记后面是两个组件的向量
:db.part/user
-100001
。第一部分是数据库分区,是必需的。第二部分是可选的。如果只编写
#db/id[:db.part/user]
,则每次出现此文本时都会得到一个新的(不同的)临时id。如果您写入
#db/id[:db.part/user-1000001]
则每次使用负索引
-1000001
时都会得到相同的临时id。因此
#db/id[:db.part/user-1000001]
不同于
#db/id[:db.part/user-1000002]

我不知道这些例子为什么使用1000000以下的索引。JavaDoc的
#db/id
的数据文本解析为,从-1(包含)到-1000000(排除)的数字保留给用户创建的临时id。也许有人能解释一下

综上所述:
#db/id[…]
是在一个事务中表示相同实体的临时id,在事务结束时由Datomic用真正的唯一id替换。如果您不必在事务中引用同一个实体两次,那么对于每个临时id,只需
#db/id[:db.part/user]
就可以了。

您编写的
#db/id[:db.part/user]
将始终创建一个新的id。但我有一个问题,
(重复2次]db/id[:db.part/user])
将两次生成相同的id,而对
#db/id[:db.part/user]
的两次单独调用将生成不同的id。想法?表单
#db/id[:db.part/user]
是一个带标签的元素,它可以产生任何值,甚至在每次出现时使用副作用生成新值。但在读者阅读后,它只是一个值,与其他任何值一样。值是不可变的。由于
repeat
仅重复值,因此所有ID都是相等的。