Clojure Datomic-需要显式手动编码唯一ID?
我的问题是-Dataomic是否需要最终用户显式手动创建唯一序列号?还是仅仅是提供的示例 我正在阅读Datomic教程 当我查看seattle-data0.dtm中加载的数据时,我在前两行看到: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
[
{: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都是相等的。