也许我还在想着SQL,但我无法写datomic架构一个简单的博客。 我真的不明白:db/cardinality
属性,这意味着什么。
在这种类型的系统而言,我们如何这些关系建模
- 该系统支持多用户
- 每个用户可以有很多种类
- 每个用户可以有很多文章
- 每个类别可以有许多用户
- 每个类别可以有很多文章
- 每篇文章可能有许多评论
- 每条评论都有一个用户
也许我还在想着SQL,但我无法写datomic架构一个简单的博客。 我真的不明白:db/cardinality
属性,这意味着什么。
在这种类型的系统而言,我们如何这些关系建模
请看下面的图和读取在全码的样品(模式,样本数据和查询) 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将确保,如果物品本身缩回收回与项目相关的所有评论。
如果要强制执行特定应用的一致性规则(如文章和评论必须有一个作者,评论必须在一定的长度等),你需要使用数据库功能 。 他们经营的交易者内部,可以原子执行任意约束,放弃那些不符合他们的交易。
让我们先来看看,你有一个对各种实体(在你的情况下,用户和评论)之间有很多关系的简单的情况:
user ---- * comment
您可以选择通过让每个评论指向只有一个用户,通过属性的方式来模拟这一点,说:类型的评论/用户 :db.type / REF。
这将是一个自然的模型,作为注释可能最多只能有一个用户。 我们说的基数至多1,即。 值的计数(在这种情况下向用户的参考文献)不能超过1。
DB /基数:这可以与纲要指定db.cardinality /之一 ,这实际上是默认的,所以我们没有拼出来明确。
请注意,由于Datomic实体不输入,它是不可能执行的1实际的基数,即。 任何属性可以是不存在的。 (实体通过自己的实际attibutes,维护和这些解释有隐含的类型是完全取决于你的应用程序)
如果在另一方面,你想要的任何评论,以适用于多个用户,你有许多一对多的关系:
user * ---- * comment
这可以通过允许属性来实现:评论/用户是:DB /基数:db.cardinality /多 ,即。 通过允许评论,用户的多个引用。
这样,每个用户可以通过多条评论被引用和每个评论可以引用多个用户。
你同样可以选择有很多的用户,而不是在评论基数的引用。
我希望这是足够清晰,以帮助让你开始:)