数据组中的限定关系

问题描述 投票:8回答:2

在一个关系型DB中,我可以有一个表 Person 和一张桌子 Hobby. 每个人都可以有 零,一个或多个嗜好我还想录下,比如说... ... 每个人的兴趣爱好的优先级.

我可以创建一个 关系表 与2个外键 PersonFKHobbyFK一根普通柱子 Priority.

在datomic中,为了模拟一个简单的n:m关系(没有优先级),我大概会创建一个 类型的属性 Reference 有卡数 Many,我会用它来 Person 实体。

但我要如何去 合格 的关系来存储优先级?是否必须像关系型的情况一样,即为该关系创建一个新的实体类型?或者有什么更好的方法吗?使用一些元数据设施或其他东西?

many-to-many data-modeling datomic
2个回答
3
投票

几天前,在Datomic邮件列表中也有人问过类似的问题。

https:/groups.google.comdtopicdatomic7uOl-TISdxAdiscussion。

总之,那里给出的答案是,你是对的:你需要创建一个关系实体,在其上存储额外的信息。


1
投票

鉴于2019年6月Datomic增加了一项新功能,这里的公认答案现在不再正确。

异种元组 现在漂亮地解决了这个问题。

这是大家对datomic很常见的一个问题。

一个属性值,也就是the veavto 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中,那叫做 属性名称空间 - 只有一个通用关系)不需要能够限定关系。

要在datalog中使用这个,你需要的是 元组不重复 职能。

© www.soinside.com 2019 - 2024. All rights reserved.