在Datomic中注释的关系

我希望能就这个SO问题扩大谈话范围,并在实施方面获得更多细节。

我的要求包括允许管理员定义关系上的标签,其数量是任意的,涉及的实体是任意的,并且涉及的实体不是偶然的(即不是实体的Component )。

对于一个人为的例子, User可以有许多Projects 。 一个Project可以有很多Users

管理员创建任意数量的标签以分配给相关用户的每个关系,例如UserProject OwnerContributorVIP等。

根据我对这个答案的理解,一个简单的ref是不够的,我需要创建一个额外的实体,像这样 -

相关Project属性

:db/ident              :project/associations
:db/valueType          :db.type/ref
:db/cardinality        :db.cardinality/many

相关的User属性

:db/ident              :user/associations
:db/valueType          :db.type/ref
:db/cardinality        :db.cardinality/many

相关Association属性

:db/ident              :association/related-ents
:db/valueType          :db.type/string
:db/cardinality        :db.cardinality/many

:db/ident              :association/assoc-id
:db/valueType          :db.type/string
:db/cardinality        :db.cardinality/one

:db/ident              :association/tag
:db/valueType          :db.type/ref
:db/cardinality        :db.cardinality/one

相关Tag属性

:db/ident              :tag/name
:db/valueType          :db.type/string
:db/cardinality        :db.cardinality/one

这是我所得到的。 我不清楚如何以惯用Datomic方式构建association实体。

要找到给定Project上的关联关系,包括但不限于Users ,以及找到relationship tag = Contributor ,我应该如何

  • 1)删除Project + User refs并通过Associations检索数据? 即返回association/related-ents包含User-Id = foo所有关联

  • 2)完全不同的东西。

  • 我想我的问题归结为我在哪里存储ref以进行高效查找? 是否应该使用不同的db.type而不是string ,或者需要使用不同的结构来建立associationproject/associationsuser/associations是否需要refs

    欣赏任何见解。

    更新


    经过一番思考后,我想我绊倒了各个实体的refs 。 我想知道我是否可以简单地拥有一个associations/relatedEnts ,它本身就是一个拥有2个Datomic db ids +标记并放弃所有其他列出的attrs的ref。 这是理想吗?

    :db/ident              :association/relatedEnts
    :db/valueType          :db.type/ref
    :db/cardinality        :db.cardinality/many
    
    :db/ident              :association/tag
    :db/valueType          :db.type/ref
    :db/cardinality        :db.cardinality/one
    

    当你定义一个实体来表示两个其他实体(在你的例子中是一个User和一个Project )之间的关系时,我建议通过Datomic引用将该实体关系实体(你的Association )与其他实体联系起来。 这保留了从一个导航到另一个的能力,而无需例如解析复合字符串。

    此外,您的示例向我暗示,您正在考虑只有一个Association实体来表示许多UsersProjects之间的关系。 虽然这种方法可行,但如果您为建模的每个关系创建一个Association实体,您将拥有更大的灵活性和潜在的自定义。 如果您更喜欢将此视为图形建模问题,则您的UserProject实体是图的节点,并且您为两个节点之间的每条边创建一个“边实体”。 这些“边缘实体”中的每一个都由具有两个引用属性的Association实例表示,一个用于User ,另一个用于Project 。 然后,该Association也可以拥有任意数量的任意附加属性,从而允许您直接将关联数据附加到关系上(即您的标签属性或任何其他想要表示关系的数据)。

    最好的,马歇尔

    链接地址: http://www.djcxy.com/p/65269.html

    上一篇: Annotated relationships in Datomic

    下一篇: Exposing Datomic entity identities to a service or REST API