Что означают все поля для db.part/db?

Я новичок в 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])

person zcaudate    schedule 05.02.2013    source источник


Ответы (1)


:db.part/db — это раздел для объектов схемы (см. документацию по схеме в разделах). Эти атрибуты db.install используются для запуска перехватчиков при установке определенных сущностей. То, что они утверждаются :db.part/db, не имеет особого значения (афаик), это просто соглашение, которое команда 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 для установки новых разделов. См. документацию по Установка определения атрибута и Создание новых разделов.

: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}]]
person Tom    schedule 12.02.2013