在Datomic中注释的关系
我希望能就这个SO问题扩大谈话范围,并在实施方面获得更多细节。
我的要求包括允许管理员定义关系上的标签,其数量是任意的,涉及的实体是任意的,并且涉及的实体不是偶然的(即不是实体的Component
)。
对于一个人为的例子, User
可以有许多Projects
。 一个Project
可以有很多Users
。
管理员创建任意数量的标签以分配给相关用户的每个关系,例如User
对Project
Owner
, Contributor
, VIP
等。
根据我对这个答案的理解,一个简单的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
,或者需要使用不同的结构来建立association
? project/associations
和user/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
实体来表示许多Users
和Projects
之间的关系。 虽然这种方法可行,但如果您为建模的每个关系创建一个Association
实体,您将拥有更大的灵活性和潜在的自定义。 如果您更喜欢将此视为图形建模问题,则您的User
和Project
实体是图的节点,并且您为两个节点之间的每条边创建一个“边实体”。 这些“边缘实体”中的每一个都由具有两个引用属性的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