我希望在this SO question上扩展对话,并在实施方面获得更多细节。
我的要求包括允许管理员在关系上定义标签,其数量是任意的,涉及的实体是任意的,所涉及的实体不是偶然的(即不是实体的Component
)。
对于一个人为的例子,User
可以有很多Projects
。 Project
可以包含多个Users
。
管理员创建任意数量的标记以分配给每个关系的相关用户,例如Owner
至Contributor
的{{1}},VIP
,User
等。
根据我对this answer的理解,一个简单的Project
是不够的,我需要创建一个额外的实体,像这样 -
相关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
据我所知。我不清楚如何以惯用的Datomic方式构造:db/ident :tag/name
:db/valueType :db.type/string
:db/cardinality :db.cardinality/one
实体。
要查找给定association
的关联关系,包括但不限于Project
,以及找到Users
的关系,我应该
1)将relationship tag = Contributor
放在refs
+ Project
上并通过User
检索数据?即返回Associations
包含association/related-ents
2)完全不同的东西。
我想我的问题归结为我在哪里存储User-Id = foo
以进行有效的查找?应该使用不同的ref
而不是db.type
,还是需要string
的不同构造? association
和project/associations
user/associations
是否必要?
欣赏任何见解。
更新
经过多次反思,我想我在各个实体的refs
上绊倒了。我想知道我是否可以简单地拥有一个refs
,它本身就是一个包含2个Datomic数据库ID +标签并且放弃所有其他列出的attrs的引用。这是理想的吗?
associations/relatedEnts
答案 0 :(得分:1)
当您定义一个实体来表示两个其他实体(示例中为User
和Project
)之间的关系时,我建议从该实体化关系实体建立链接(您的Association
)通过Datomic引用到其他实体。这保留了从一个导航到另一个的能力,而不必例如解析复合字符串。
此外,您的示例向我建议您考虑只使用一个Association
实体来表示许多Users
和Projects
之间的关系。虽然这种方法可行,但如果为正在建模的每个关系创建Association
实体,您将拥有更大的灵活性和自定义潜力。如果您更愿意将此视为图形建模问题,则User
和Project
实体是图形的节点,您可以为两个节点之间的每条边创建“边缘实体”。每个“边缘实体”都由Association
的实例表示,该实例具有两个参考属性,一个属于User
,另一个属于Project
。然后Association
也可以拥有任意数量的任意附加属性,允许您将数据直接附加到关系(即您的标记属性或您想要表示关系的任何其他数据)。
最佳, 马歇尔