Datomic - 需要对唯一ID进行明确的手动编码吗?

haw*_*eye 10 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 "Capitol Hill", :neighborhood/district #db/id[:db.part/user -1000001]}
Run Code Online (Sandbox Code Playgroud)

特别注意值

:db/id #db/id[:db.part/user -1000001],
:db/id #db/id[:db.part/user -1000002]
#db/id[:db.part/user -1000001]
Run Code Online (Sandbox Code Playgroud)

也许您可以帮助我理解 - 在准备插入数据时,这似乎明确需要手动生成的唯一ID序列号.

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

当我去做我自己的示例模式和数据插入时 - 我发现我也需要插入手动ID号.我错过了什么?

小智 17

回答您的问题:没有Datomic不要求最终用户生成标识符.您在西雅图示例中看到的是临时ID.

每次要向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]
Run Code Online (Sandbox Code Playgroud)

其中两个是相同的(我会在一瞬间解释负数).这意味着标记有临时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的索引.#db/id解析数据文字的tempid的JavaDoc 表示从-1(含)到-1000000(独占)的数字是为用户创建的temp保留的IDS.所以也许有人可以对此有所了解.

总结一下:#db/id[...]是在一次交易中表达相同实体的临时ID,并且在交易结束时由Datomic替换为真实的唯一ID.如果您不必在事务中引用同一个实体两次,那么您可以使用#db/id[:db.part/user]每个临时ID.