2013-02-05 4 views
6

Ich bin ein Neuling zu Datomic und ich versuche immer noch herauszufinden, wie das System gebaut wurde. Insbesondere verstehe ich nicht, welche Rolle: db.part/db spielt, wie es scheint, jedes Mal benötigt wird, wenn ein Schema installiert wird. Könnte jemand etwas Licht auf das werfen, was das alles bedeutet?Was bedeuten alle Felder für 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]) 

Antwort

9

:db.part/db ist die Partition für Schema-Einheiten (siehe Schema docs auf partitions). Diese db.install-Attribute werden verwendet, um Hooks bei der Installation bestimmter Entitäten auszulösen. Dass sie von :db.part/db hat keine besondere Bedeutung (afaik) geltend gemacht werden, ist dies nur die Konvention des Datomic Team für das die Installation von Attributen gewählt usw.

So, zum Beispiel, wenn Sie eine Transaktion wie einreichen:

[{: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]}] 

, die an (in Clojure jetzt anstelle von EDN) entspricht:

(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 dann bemerkt man einen Wert für :db.part/db ‚s Validieren hinzugefügt :db.install/attribute, dass man die zur Verfügung gestellt erforderliche Attribute für ein Attribut und das neue Attribut in der Datenbank installieren, damit Sie es nach der Transaktion verwenden können.

Ebenso können Sie :db.install/_partition :db.part/db verwenden, um neue Partitionen zu installieren. Siehe die Dokumente unter Installing an attribute definition und Creating new partitions.

:db.install/valueType könnte einen Tag verwendet werden, Ihre eigenen Wertetypen zu installieren, aber diese Funktion ist noch nicht fertig. :db.install/function scheint für den internen Gebrauch zu sein. Ich bin mir seines Zwecks nicht sicher. Der dokumentierte Weg zu install database functions ist anders.

Diese Attribute (außer :db.install/function) sind auch für Abfragen und die db Inspektion. Zum Beispiel können wir die Menge aller installierten Werttypen, falls herausziehen wir vergessen haben:

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} 

Oder wir können Abfragen über die vorhandenen Attribute schreiben:

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}]]