2013-02-05 34 views
6

Tôi là một người mới đến datomic và tôi vẫn đang cố gắng tìm ra cách hệ thống đã được xây dựng. Đặc biệt, tôi không hiểu vai trò gì: db.part/db phát như nó có vẻ cần thiết mỗi khi một lược đồ được cài đặt. Ai đó có thể làm sáng tỏ điều này có nghĩa gì không?Tất cả các trường cho db.part/db là gì?

 
(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]) 

Trả lời

9

:db.part/db là phân vùng cho các tổ chức schema (xem các tài liệu schema trên partitions). Các thuộc tính db.install này được sử dụng để kích hoạt các móc trên cài đặt của các thực thể nhất định. Rằng họ đang khẳng định của :db.part/db không có ý nghĩa đặc biệt (afaik), điều này chỉ là ước đội Datomic chọn cho đại diện cho quá trình cài đặt các thuộc tính vv

Vì vậy, ví dụ, khi bạn gửi một giao dịch như:

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

tương đương với (trong Clojure tại thay vì edn): thông báo

(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]]) 

sau đó Datomic bạn đã thêm giá trị cho :db.part/db 's :db.install/attribute, xác nhận rằng bạn đã cung cấp các thuộc tính bắt buộc cho một thuộc tính và cài đặt thuộc tính mới vào cơ sở dữ liệu để bạn có thể sử dụng nó sau giao dịch.

Tương tự, bạn có thể sử dụng :db.install/_partition :db.part/db để cài đặt phân vùng mới. Xem tài liệu trên Installing an attribute definitionCreating new partitions.

:db.install/valueType một ngày nào đó có thể được sử dụng để cài đặt các loại giá trị tùy chỉnh của riêng bạn, nhưng tính năng này chưa sẵn sàng. :db.install/function dường như được sử dụng nội bộ. Tôi không chắc chắn về mục đích của nó. Cách được ghi thành tài liệu là install database functions là khác nhau.

Các thuộc tính này (trừ :db.install/function) cũng thuận tiện cho các truy vấn và kiểm tra db. Ví dụ, chúng ta có thể rút ra khỏi các thiết lập của tất cả các kiểu giá trị cài đặt, trong trường hợp chúng ta quên:

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} 

Hoặc chúng ta có thể viết các truy vấn trên các thuộc tính hiện có:

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}]] 
Các vấn đề liên quan