【问题标题】:How to use Datomic partitions?如何使用 Datomic 分区?
【发布时间】:2017-11-24 16:31:15
【问题描述】:

我想使用 Datomic 分区来提高我的应用程序的可扩展性。

首先,我首先在一个事务中创建了一个分区:

{:db/id "communities"
   :db/ident :communities}
 [:db/add :db.part/db :db.install/partition "communities"]

其次,我在另一个事务中创建了数据库模式:

{:db/ident :person/name
 :db/valueType :db.type/string
 :db/cardinality :db.cardinality/one
 :db.install/_attribute :communities}

{:db/ident :person/age
 :db/valueType :db.type/int
 :db/cardinality :db.cardinality/one
 :db.install/_attribute :communities}

{:db/ident :person/sibblings
 :db/valueType :db.type/int
 :db/cardinality :db.cardinality/one
 :db.install/_attribute :communities}

下面是一个简单查询的示例:

(d/q '[:find ?name ?age
       :where
       [?p :person/name ?name]
       [?p :person/age ?age]]
   db)

当我发出此查询时,我收到以下错误:

Unhandled datomic.impl.Exceptions$IllegalArgumentExceptionInfo :db.error/not-an-entity Unable to resolve entity: :person/name {:db/error :db.error/not-an-entity}

当我将每个属性的 :db.install/_attribute :communities 替换为 :db.install/_attribute :db.part/db 时,查询工作正常。我的所有其他查询都有同样的问题。

我错过了什么吗?

【问题讨论】:

    标签: clojure datomic


    【解决方案1】:

    用户定义的分区不是用户定义属性的替代“链接点”。属性始终通过:db.install/attribute 属性1 链接到:db.part/db 实体,并且它们始终位于:db.part/db 分区中。

    分区允许您确保与某些 entities 相关的 datoms 将在 Datomic 的索引中紧密地出现,方法是确保它们的实体 ID 分配在特定范围内。如果您的应用可能会同时访问驻留在某个分区中的实体,这可能会提高您的查询性能。也可以遍历与驻留在某个分区中的实体相关的 datom,而不会遇到不相关的 datom(使用seek-datoms + EAVT + entid-at)。

    定义分区后使用它的方法是在创建新实体时将其:db/ident 传递给datomic.api/tempid(或者您可以在edn 文件中将其与#db/id 标记文字一起使用):

    @(d/transact connection
       {:db/id (d/tempid :some-partition)
        … …})
    

    如果您随后发出一个查询,恰好获取与该实体相关的一些 EAVT 块,这些块可能会包含有关同一分区中其他实体的信息(除非该实体具有足够数量的断言属性来填充一个块,我想……但即使那样,您也会在索引树中获取一些相关节点),因此您的对等方将能够从缓存中检索有关它们的信息。

    如果您希望从这种类型的位置中看到主要的好处,那么分区可能值得研究。如果您不确定您的应用是否会受益,那也没关系。显然这个特性在野外使用的并不多,事实上新的(-ish)客户端 API 目前根本没有公开它。


    1 虽然请注意,自 0.9.5530 以来,显式的 :db.install/_attribute :db.part/db 行已不再需要:Datomic 现在推断新引入的实体将是来自“属性属性”的存在的属性:db/ident:db/valueType:db/cardinality——这是可能的,因为后两者专门由属性使用——并为您添加了 :db.install/attribute 链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-30
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多