7

我是 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])
4

1 回答 1

10

:db.part/db是架构实体的分区(请参阅partitions上的架构文档)。这些 db.install 属性用于触发安装某些实体的挂钩。断言它们: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's添加了一个值:db.install/attribute,验证您是否为某个属性提供了所需的属性,并将新属性安装到数据库中,以便您可以在事务之后使用它。

同样,您可以使用:db.install/_partition :db.part/db安装新分区。请参阅有关安装属性定义创建新分区的文档。

:db.install/valueType有朝一日可以用来安装你自己的自定义值类型,但这个功能还没有准备好。:db.install/function似乎是供内部使用。我不确定它的目的。安装数据库功能的文档化方式是不同的。

这些属性(除了: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}]]
于 2013-02-12T01:12:47.597 回答