schema – Datomic – db / isComponent等效于强制执行外键依赖吗?

Datomic Schema doco中 – 他们提到了一个名为db / isComponent的模式属性.这似乎是指由以下定义的关系:db.type / ref.

西雅图示例中未使用db / isComponent.可以公平地说:Datomic中的db.type / ref关系不是“强制执行”(使用关系数据库外键依赖概念) – 除非你用db / isComponent设置它们吗?

包含关系(:db.type / ref:db / isComponent)

:db / isComponent用于指定包含关系,即来自UML的组合关系.你可以把它想象成一种“A有B”的关系.建模简单博客的一部分就是一个明显的例子:

在Datomic中,如果您使用:db / isComponent属性作为上述文章评论关系的一部分,则撤消文章也会收回其所有评论.有关完整的代码示例,请查看Datomic: containment relationships i.e. db/isComponent要点.

请注意,Datomic中没有任何内容可以阻止您将错误类型的实体添加到:db.type / ref属性.在上面的示例中,Datomic将允许您添加对“作者”实体(而不是注释)的引用,而不需要真正关心.这就是外键约束发挥作用的地方.

外键约束(:db.type / ref数据库函数)

Datomic使用:db.type / ref属性定义关系,但并未真正强制执行任何有关它们的任何内容.要使用任意外键约束,您需要使用database functions.

在您提到的西雅图数据库中:社区/ orgtype属性应该仅引用一些允许的枚举值(:community.orgtype / *),但实际上在运行时没有强制执行:

为了说明如何在Datomic中实现任意外键约束,我编写了一个数据库函数(称为add-fk),它可以防止错误枚举值与:community / orgtype属性相关联.

有关完整的代码示例,请查看Datomic: database functions and foreign-key constraints要点.例如,add-fk数据库函数行为如下所示:

;; will succeed
 [[:db/add #db/id [:db.part/user] :community/name "15th Ave Community"]
  [:add-fk #db/id [:db.part/user] :community/orgtype :community.orgtype/personal]])

 ;; will fail
 [[:db/add #db/id [:db.part/user] :community/name "15th Ave Community"]
  [:add-fk #db/id [:db.part/user] :community/orgtype :community.type/email-list]])
 ;; java.lang.Exception: :community.type/email-list is not one of 
 ;; [[:community.orgtype/community],[:community.orgtype/commercial],;; [:community.orgtype/personal],[:community.orgtype/nonprofit]]

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...