我的问题是 - 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号。我错过了什么?
答案 0 :(得分:17)
回答您的问题:否Datomic不要求最终用户生成标识符。您在西雅图示例中看到的是temporary ids。
每当您想要向Datomic添加有关新实体的一些事实时,您必须为每个新实体提供一个临时ID。此ID将由Datomic替换为真正的唯一ID。
现在你可能会问自己为什么一开始就要使用这个临时ID?需要临时ID来表示单个事务中所有新实体之间的关系。在您的示例中,您有ids:
: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]
的新实体在assertions中都是相同的。
现在我必须解释data literal (other link) #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]
,则每次使用否定索引-1000001
时都会获得相同的临时ID。因此#db/id[:db.part/user -1000001]
与#db/id[:db.part/user -1000002]
不同。
我不确切知道为什么这些示例使用低于1000000的索引。tempid的JavaDoc,其中#db/id
的数据文字解析为,表示从-1(含)到-1的数字-1000000(不包括)保留给用户创建的临时ID。所以也许有人可以对此有所了解。
总结一下:#db/id[...]
是在一个交易中表达相同实体的临时ID,在交易结束时由Datomic替换为真实的唯一ID。如果您不必在事务中引用同一个实体两次,那么对于每个临时ID,只需#db/id[:db.part/user]
即可。