1

我希望扩展关于这个 SO 问题的对话,并在实施方面获得更多细节。

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

举一个人为的例子, aUser可以有很多Projects. 一个Project可以有很多Users

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

根据我对这个答案的理解,简单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

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

要查找给定的关联关系Project,包括但不限于Users,以及在哪里查找关系relationship tag = Contributor,我应该

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

  • 2) 完全不同的东西。

我想我的问题归结为我在哪里存储ref有效查找?是否db.type应该使用不同的来代替string,或者需要不同的构造associationproject/associations甚至user/associations refs是必要的吗?

欣赏任何见解。

更新


经过多一点思考,我想我refs在各种实体上绊倒了。我想知道我是否可以简单地拥有一个associations/relatedEnts本身就是一个包含 2 个 Datomic db ids + 标签的 ref 并删除所有其他列出的 attrs。这是理想的吗?

: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
4

1 回答 1

3

当您定义一个实体来表示其他两个实体(在您的示例中为 aUser和 a Project)之间的关系时,我建议Association通过 Datomic 引用将该实体化的关系实体(您的)与其他实体建立联系。这保留了从一个导航到另一个的能力,而不必解析复合字符串。

此外,您的示例向我表明,您正在考虑仅使用一个实体来表示 many和Association之间的关系。虽然这种方法可行,但如果您为正在建模的每个关系创建一个实体,您将拥有更大的灵活性和自定义潜力。如果您更愿意将此视为图形建模问题,则您的和实体是图形的节点,并且您为两个节点之间的每条边创建一个“边实体”。这些“边缘实体”中的每一个都由一个具有两个引用属性的实例表示,一个指向 the ,一个指向. 然后UsersProjectsAssociationUserProjectAssociationUserProjectAssociation还可以有任意数量的任意附加属性,允许您将数据直接附加到关系中(即对于您的标签属性,或您想要表示的有关关系的任何其他数据)。

最好的,马歇尔

于 2016-10-24T15:53:42.923 回答