在一个关系型DB中,我可以有一个表 Person
和一张桌子 Hobby
. 每个人都可以有 零,一个或多个嗜好我还想录下,比如说... ... 每个人的兴趣爱好的优先级.
我可以创建一个 关系表 与2个外键 PersonFK
和 HobbyFK
一根普通柱子 Priority
.
在datomic中,为了模拟一个简单的n:m关系(没有优先级),我大概会创建一个 类型的属性 Reference
有卡数 Many
,我会用它来 Person
实体。
但我要如何去 合格 的关系来存储优先级?是否必须像关系型的情况一样,即为该关系创建一个新的实体类型?或者有什么更好的方法吗?使用一些元数据设施或其他东西?
几天前,在Datomic邮件列表中也有人问过类似的问题。
https:/groups.google.comdtopicdatomic7uOl-TISdxAdiscussion。
总之,那里给出的答案是,你是对的:你需要创建一个关系实体,在其上存储额外的信息。
鉴于2019年6月Datomic增加了一项新功能,这里的公认答案现在不再正确。
异种元组 现在漂亮地解决了这个问题。
这是大家对datomic很常见的一个问题。
一个属性值,也就是the v
在 eavto
5-tuple,现在本身也可以是一个tuple。
这是一个最大长度为8的clojure向量。 虽然由于最大长度为8,这不是一个存储任意数量的元数据的方法,但这是一个很好的折衷方案,使datomic能够保留它所提供的所有其余杠杆和简单性。
官方 博文 公告。
讨论发布关于 啭.
在你的情况下。
{:db/ident :person/hobby
:db/valueType :db.type/tuple
:db/tupleTypes [:db.type/ref :db.type/long] ; hobby, priority
:db/cardinality :db.cardinality/many}
现在,你的额外的 "表"(在datomic中,那叫做 属性名称空间 - 只有一个通用关系)不需要能够限定关系。