gpt4 book ai didi

clojure - db.part/db 的所有字段是什么意思?

转载 作者:行者123 更新时间:2023-12-04 11:09:28 31 4
gpt4 key购买 nike

我是 datomic 的新手,我仍在努力弄清楚系统是如何构建的。特别是,我不明白 :db.part/db 扮演什么角色,因为每次安装架构时似乎都需要它。有人可以解释一下这一切意味着什么吗?

(需要 '[datomic.api :as d])
(def uri "datomic:mem://sample")
(d/create-database uri)
(def conn (d/connect uri))

(pprint (seq (d/entity dbval :db.part/db)))

;; =>
;; ([:db/doc "系统分区的名称。系统分区包括datomic的核心,以及用户模式:类型定义、属性定义、分区定义和数据函数定义。"]
;; [:db.install/function #{:db.fn/cas :db.fn/retractEntity}]
;; [:db.install/属性
;; #{:db/noHistory :db.install/partition :db/cardinality
;; :db.install/attribute :db/index :db/unique :db/fulltext
;; :db/txInstant :db/lang :db/doc :db.install/valueType :db/code
;; :db/isComponent :db/fn :db.install/function :db/valueType :db/ident
;; :fressian/标签}]
;; [:db.install/valueType
;; #{:db.type/uuid :db.type/bigint :db.type/uri :db.type/ref
;; :db.type/keyword :db.type/bytes :db.type/string :db.type/instant
;; :db.type/fn :db.type/long :db.type/bigdec :db.type/boolean
;; :db.type/double :db.type/float}]
;; [:db.install/partition #{:db.part/db}]
;; [:db/ident :db.part/db])

最佳答案

:db.part/db是模式实体的分区(请参阅 partitions 上的模式文档)。这些 db.install 属性用于在某些实体的安装上触发 Hook 。他们断言 :db.part/db没有特别的意义(afaik),这只是 Datomic 团队选择的代表安装属性等的约定。

因此,例如,当您提交如下交易时:

[{:db/ident :person/name
:db/cardinality :db.cardinality/one
:db/valueType :db.type/string
:db.install/_attribute :db.part/db
:db/id #db/id[:db.part/db]}]

这相当于(现在在 Clojure 中而不是 edn 中):
(let [id (datomic.api/tempid :db.part/db)]
[[:db/add id :db/ident :person/name]
[:db/add id :db/cardinality :db.cardinality/one]
[:db/add id :db/valueType :db.type/string]
[:db/add :db.part/db :db.install/attribute id]])

然后 Datomic 通知您为 :db.part/db 添加了一个值的 :db.install/attribute ,验证您是否提供了属性所需的属性,并将新属性安装到数据库中,以便您可以在事务处理后使用它。

同样,您可以使用 :db.install/_partition :db.part/db安装新分区。请参阅 Installing an attribute definition 上的文档和 Creating new partitions .
:db.install/valueType有一天可以用来安装你自己的自定义值类型,但这个功能还没有准备好。 :db.install/function似乎是供内部使用。我不确定它的目的。记录到 install database functions 的方式是不同的。

这些属性(除了 :db.install/function )也方便查询和检查数据库。例如,我们可以拉出所有已安装值类型的集合,以防我们忘记:
user> (:db.install/valueType (datomic.api/entity db :db.part/db))
#{:db.type/uuid :db.type/bigint :db.type/uri :db.type/ref
:db.type/keyword :db.type/bytes :db.type/string :db.type/instant
:db.type/fn :db.type/long :db.type/bigdec :db.type/boolean
:db.type/double :db.type/float}

或者我们可以编写对现有属性的查询:
user> (datomic.api/q '[:find ?ns (distinct ?attr) :where
[:db.part/db :db.install/attribute ?a]
[?a :db/ident ?attr]
[(namespace ?attr) ?ns]]
db)
[["db" #{:db/noHistory :db/cardinality :db/index :db/unique
:db/fulltext :db/txInstant :db/lang :db/doc
:db/code :db/isComponent :db/fn :db/valueType
:db/ident}]
["db.install" #{:db.install/partition :db.install/attribute
:db.install/valueType :db.install/function}]
["fressian" #{:fressian/tag}]]

关于clojure - db.part/db 的所有字段是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14704604/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com