我是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])
Tom*_*Tom 10
:db.part/db是架构实体的分区(请参阅分区上的架构文档).这些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]}]
Run Code Online (Sandbox Code Playgroud)
这相当于(现在在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]])
Run Code Online (Sandbox Code Playgroud)
然后Datomic注意到你已经添加了一个价值:db.part/db的: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}
Run Code Online (Sandbox Code Playgroud)
或者我们可以在现有属性上编写查询:
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}]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1076 次 |
| 最近记录: |