造型在datomic多许多一对多的关系(modelling multiple many-to-man

2019-08-16 19:21发布

也许我还在想着SQL,但我无法写datomic架构一个简单的博客。 我真的不明白:db/cardinality属性,这意味着什么。

在这种类型的系统而言,我们如何这些关系建模

  • 该系统支持多用户
  • 每个用户可以有很多种类
  • 每个用户可以有很多文章
  • 每个类别可以有许多用户
  • 每个类别可以有很多文章
  • 每篇文章可能有许多评论
  • 每条评论都有一个用户

Answer 1:

请看下面的图和读取在全码的样品(模式,样本数据和查询) https://gist.github.com/a2ndrade/5651419 。 它应该帮助您了解如何在数据模型Datomic。

查询

需要注意的是有些关系不明确建模,因为Datomic关系是双向的,因为你可以检索使用简单的数据记录查询信息的其余部分。 例如,查询:

(d/q '[:find ?cid ?c
   :in $ ?u
   :where
   [?uid :user/username ?u]
   [?aid :article/category ?cid]
   [?aid :article/author ?uid]
   [?cid :category/name ?c]]
 (d/db conn) "john.smith")

查找所有类别ID - 和一个用户(“和John.Smith”)写文章为自己业者名称。

包含关系

一个重要的建模的决定是有文章指出注释和标记的关系为:db/isComponent因为意见不应该对自己的但作为一篇文章的一部分而存在。 Datomic将确保,如果物品本身缩回收回与项目相关的所有评论。

强制遵守业务规则

如果要强制执行特定应用的一致性规则(如文章和评论必须有一个作者,评论必须在一定的长度等),你需要使用数据库功能 。 他们经营的交易者内部,可以原子执行任意约束,放弃那些不符合他们的交易。



Answer 2:

让我们先来看看,你有一个对各种实体(在你的情况下,用户和评论)之间有很多关系的简单的情况:

user ---- * comment

您可以选择通过让每个评论指向只有一个用户,通过属性的方式来模拟这一点,说类型的评论/用户 :db.type / REF。

这将是一个自然的模型,作为注释可能最多只能有一个用户。 我们说的基数至多1,即。 值的计数(在这种情况下向用户的参考文献)不能超过1。

DB /基数:这可以与纲要指定db.cardinality /之一 ,这实际上是默认的,所以我们没有拼出来明确。

请注意,由于Datomic实体不输入,它是不可能执行的1实际的基数,即。 任何属性可以是不存在的。 (实体通过自己的实际attibutes,维护和这些解释有隐含的类型是完全取决于你的应用程序)

如果在另一方面,你想要的任何评论,以适用于多个用户,你有许多一对多的关系:

user * ---- * comment

这可以通过允许属性来实现:评论/用户:DB /基数:db.cardinality /多 ,即。 通过允许评论,用户的多个引用。

这样,每个用户可以通过多条评论被引用和每个评论可以引用多个用户。

你同样可以选择有很多的用户,而不是在评论基数的引用。

我希望这是足够清晰,以帮助让你开始:)



文章来源: modelling multiple many-to-many relationships in datomic