2013-02-05 11 views
6

私はdatomicの初心者ですが、私はまだシステムの構築方法を理解しようとしています。特に、私はどのような役割:db.part/dbがスキーマがインストールされるたびに必要と思われるかを理解していません。誰かがこれが何を意味するのかについて何か光を当てることができましたか?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]) 

答えて

9

:db.part/dbpartitions上のスキーマのドキュメントを参照してください)スキーマエンティティのためのパーティションです。これらのdb.install属性は、特定のエンティティのインストール時にフックをトリガーするために使用されます。 (私の知る限り)特別な意味を持っていない、これはDatomicチームは属性のインストールを表現するために選んだだけの慣例である彼らは:db.part/dbのアサートされていること、など

だから、例えば、あなたのようにトランザクションを送信するとき:

あなたが提供することを検証し、

(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の値を追加しました:(今の代わりEDNのClojureの中)に相当します

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

属性の必須属性、およびトランザクションの後に使用できるように新しい属性をデータベースにインストールすることができます。

同様に、:db.install/_partition :db.part/dbを使用して新しいパーティションをインストールできます。 Installing an attribute definitionCreating new partitionsのドキュメントを参照してください。

:db.install/valueTypeいつか独自のカスタム値の種類をインストールすることができますが、この機能はまだ準備ができていません。 :db.install/functionが内部使用のために表示されます。私はその目的が分からない。 install database functionsへの文書化された方法は異なります。

これらの属性(:db.install/functionを除く)は、照会およびdbの検査にも便利です。

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}]] 
関連する問題