Datomic

时间:2016-10-20 17:15:19

标签: database-design clojure datomic datalog

我希望在this SO question上扩展对话,并在实施方面获得更多细节。

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

对于一个人为的例子,User可以有很多ProjectsProject可以包含多个Users

管理员创建任意数量的标记以分配给每个关系的相关用户,例如OwnerContributor的{​​{1}},VIPUser等。

根据我对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的不同构造? associationproject/associations user/associations是否必要?

欣赏任何见解。

更新

经过多次反思,我想我在各个实体的refs上绊倒了。我想知道我是否可以简单地拥有一个refs,它本身就是一个包含2个Datomic数据库ID +标签并且放弃所有其他列出的attrs的引用。这是理想的吗?

associations/relatedEnts

1 个答案:

答案 0 :(得分:1)

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

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

最佳, 马歇尔