10

我的问题是——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 号。我错过了什么?

4

1 回答 1

17

回答您的问题:No Datomic 不需要最终用户生成标识符。您在西雅图示例中看到的是临时 ids

每次你想向 Datomic 添加一些关于新实体的事实时,你必须给每个新实体一个临时 ID。这个 id 将被 Datomic 替换为真正的唯一 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-1000001。第一部分是数据库分区,是必需的。第二部分是可选的。如果你只写#db/id[:db.part/user],每次出现这个文字时,你都会得到一个新的(不同的)临时 id。如果您编写#db/id[:db.part/user -1000001],每次使用负索引时都会获得相同的临时 id -1000001。所以#db/id[:db.part/user -1000001]不同于#db/id[:db.part/user -1000002].

我不完全知道为什么这些示例使用低于 1000000 的索引。tempid的 JavaDoc中的数据文字#db/id解析为,表示从 -1(包括)到 -1000000(不包括)的数字保留给用户创建的 temp身份证。所以也许有人可以对此有所了解。

总结一下:#db/id[...]是在一个事务中表示相同实体的临时 ID,并在事务结束时由 Datomic 替换为真实的唯一 ID。如果您不必在事务中两次引用同一个实体,则只需#db/id[:db.part/user]为每个临时 ID 就可以了。

于 2013-01-28T21:57:08.140 回答