首页 文章

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

提问于
浏览
6

我是datomic的新手,我还在试图弄清楚系统是如何构建的 . 特别是,我不明白什么角色:db.part / db播放,因为每次安装架构时似乎都需要它 . 有人可以说明这一切意味着什么吗?

(require '[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 "Name of the system partition. The system partition includes the core of datomic, as well as user schemas: type definitions, attribute definitions, partition definitions, and data function definitions."]
;;  [:db.install/function #{:db.fn/cas :db.fn/retractEntity}]
;;  [:db.install/attribute
;;   #{: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/tag}]
;;  [: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])

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:db.install/attribute 添加了一个值,验证您是否为属性提供了必需的属性,并将新属性安装到数据库中,以便您可以在事务后使用它 .

    同样,您可以使用 :db.install/_partition :db.part/db 来安装新分区 . 请参阅Installing an attribute definitionCreating 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}]]
    

相关问题