clojure - 在数据中建模多个多对多关系

标签 clojure datomic

也许我还在考虑 sql,但我在为一个简单的博客编写数据模式时遇到了麻烦。
我真的不明白:db/cardinality属性及其含义。

就这种类型的系统而言,我们如何对这些关系进行建模

  • 系统支持多用户
  • 每个用户可能有多个类别
  • 每个用户可能有很多文章
  • 每个类别可能有多个用户
  • 每个分类可能有很多文章
  • 每篇文章可能有很多评论
  • 每条评论都有一个用户
  • 最佳答案

    查看下图并阅读 https://gist.github.com/a2ndrade/5651419 处的完整代码示例(架构、示例数据和查询) .它应该可以帮助您了解如何在 Datomic 中对数据进行建模。

    Datomic Schema: Blog

    查询

    请注意,某些关系没有明确建模,因为 Datomic 中的关系是双向的,并且您可以使用简单的 Datalog 查询检索其余信息。例如,查询:

    (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")
    

    查找用户 ("john.smith") 为其撰写文章的所有类别 ID - 及其名称。

    收容关系

    一个重要的建模决策是让文章指向评论并将关系标记为 :db/isComponent因为评论不应该单独存在,而是作为文章的一部分。如果文章本身被撤回,Datomic 将确保撤回与文章相关的所有评论。

    执行业务规则

    如果您想强制执行特定于应用程序的一致性规则(例如文章和评论必须有作者,评论必须有一定长度等),您需要使用 database functions .它们在交易者内部运行,可以原子地强制执行任意约束,中止不符合它们的交易。

    关于clojure - 在数据中建模多个多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14724991/

    相关文章:

    datomic - 如何登录Datomic的H2存储?

    limit - Datomic Free 可以处理多少吞吐量?

    clojure - 如何帮助Clojure理解0是最小的自然数?

    amazon-web-services - 如何使用 Amazonica 库在 Clojure 中设置 S3 路径样式?

    intellij-idea - 如何在 Cursive IDE 中启用彩虹括号?

    clojure - Clojure 相同吗?如果被比较的东西实际上是同一个实例,函数只返回 true 吗?

    unit-testing - 如何对懒惰进行单元测试

    java - Uberjar 中止,因为 jar 失败 : duplicate entry: META-INF/MANIFEST. MF

    clojure - 有没有办法将数据库重置到特定时间点(主要用于调试)

    clojure - Datomic 中多个属性的全文搜索