Database 用Datomic嵌套结构

Database 用Datomic嵌套结构,database,database-design,clojure,datomic,Database,Database Design,Clojure,Datomic,使用Datomic,我试图思考如何在列表中嵌套列表 Clojure数据结构的一个例子是(参见图1)。我知道Datomic有引用的概念(如图2所示)。但这些看起来只是标量类型,而不是对象(本身) 图1 图2 [编辑] 事实上,我想我可能已经找到了答案。我浏览了代码库,找到了下面的示例。但我仍然不清楚是什么将:comments名称空间与:comment/body(或:comment/author)名称空间明确地联系在一起。Datomic是否只是使用约定将:comments链接到:comment

使用Datomic,我试图思考如何在列表中嵌套列表

Clojure数据结构的一个例子是(参见图1)。我知道Datomic有引用的概念(如图2所示)。但这些看起来只是标量类型,而不是对象(本身)

图1

图2

[编辑]

事实上,我想我可能已经找到了答案。我浏览了代码库,找到了下面的示例。但我仍然不清楚是什么将:comments名称空间与:comment/body(或:comment/author)名称空间明确地联系在一起。Datomic是否只是使用约定将:comments链接到:comment

  ;; comments
  [{:db/id #db/id[:db.part/db]
  :db/ident :comments
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/many
    :db/isComponent true
    :db.install/_attribute :db.part/db}
   {:db/id #db/id[:db.part/db]
    :db/ident :comment/body
    :db/valueType :db.type/string
    :db/cardinality :db.cardinality/one
    :db.install/_attribute :db.part/db}
   {:db/id #db/id[:db.part/db]
    :db/ident :comment/author
    :db/valueType :db.type/ref
    :db/cardinality :db.cardinality/one
    :db.install/_attribute :db.part/db}]

图1

您不能直接持久化多维列表/向量,但可以使用链接实体来完成类似的操作:

;; sample attributes
[{:db/id #db/id[:db.part/db]
  :db/ident :some/ref-value
  :db/valueType :db.type/ref
  :db/isComponent true
  :db/cardinality :db.cardinality/many  
  :db.install/_attribute :db.part/db}
  {:db/id #db/id[:db.part/db]
  :db/ident :some/list-value
  :db/valueType :db.type/string
  :db/cardinality :db.cardinality/many
  :db.install/_attribute :db.part/db}]

;; [["a" "b" "c"]["d" "e" "f"]]
 [{:db/id #db/id[:db.part/user -1]
 :some/list-value ["a" "b" "c"]}
 {:db/id #db/id[:db.part/user -2]
 :some/list-value ["d" "e" "f"]} 
 {:db/id #db/id[:db.part/user]
 :some/ref-value [#db/id[:db.part/user -1] #db/id[:db.part/user -2]]}]
请注意,可以使用负数将实体链接在一起。当您处理它们时,它们将被真实的实体ID替换

编辑:从版本0.8.4020开始,Datomic支持嵌套(包含关系由
:db/isComponent
指定)作为事务数据的一部分。e、 g

 ;; [["a" "b" "c"]["d" "e" "f"]]
 [{:db/id #db/id[:db.part/db]
   :some/ref-value [{:some/list-value ["a" "b" "c"]}
                    {:some/list-value ["d" "e" "f"]}]}]

嵌套映射扩展为两个子实体,它们都是在与容器/父实体相同的分区中创建的。有关完整的代码示例,请参见

Nothing-ties:comments和:comment/body。这只是一个命名约定。有关如何持久保存列表列表的示例,请参见下面的答案。我在Clojure中使用了两个随机属性定义来持久化[[“a”“b”“c”][“d”“e”“f”]]的等价物。啊,我明白了,我明白了。非常感谢。我更新了我的答案,使用了一个新的Datomic功能,它似乎更接近(如果不是确切的话)您所寻找的。希望能有帮助。
;; sample attributes
[{:db/id #db/id[:db.part/db]
  :db/ident :some/ref-value
  :db/valueType :db.type/ref
  :db/isComponent true
  :db/cardinality :db.cardinality/many  
  :db.install/_attribute :db.part/db}
  {:db/id #db/id[:db.part/db]
  :db/ident :some/list-value
  :db/valueType :db.type/string
  :db/cardinality :db.cardinality/many
  :db.install/_attribute :db.part/db}]

;; [["a" "b" "c"]["d" "e" "f"]]
 [{:db/id #db/id[:db.part/user -1]
 :some/list-value ["a" "b" "c"]}
 {:db/id #db/id[:db.part/user -2]
 :some/list-value ["d" "e" "f"]} 
 {:db/id #db/id[:db.part/user]
 :some/ref-value [#db/id[:db.part/user -1] #db/id[:db.part/user -2]]}]
 ;; [["a" "b" "c"]["d" "e" "f"]]
 [{:db/id #db/id[:db.part/db]
   :some/ref-value [{:some/list-value ["a" "b" "c"]}
                    {:some/list-value ["d" "e" "f"]}]}]