我是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])
答案 0 :(得分: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
的{{1}}添加了一个值,验证您是否为属性提供了必需的属性,并将新属性安装到数据库中,以便您可以在之后使用它交易。
同样,您可以使用:db.install/attribute
安装新分区。请参阅Installing an attribute definition和Creating new partitions上的文档。
:db.install/_partition :db.part/db
可用于安装您自己的自定义值类型,但此功能尚未准备就绪。 :db.install/valueType
似乎供内部使用。我不确定它的用途。记录在install database functions的方式不同。
这些属性(: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}