8

在关系数据库中,我可以有一个 tablePerson和一个 table Hobby。每个人都可以有零个、一个或多个爱好,我也想记录一下,比如说,这些爱好对每个人的优先级

我可以使用 2 个外键和和一个普通列创建一个关系表PersonFKHobbyFKPriority

在 datomic 中,为了建模一个简单的 n:m 关系(没有优先级),我可能会创建一个带有 cardinality的类型属性ReferenceMany,我将用于Person实体。

但是我将如何去限定该关系以能够存储优先级?是否必须类似于关系案例,即通过仅为该关系创建新实体类型来完成?或者有没有更好的方法?使用一些元数据工具之类的?

4

2 回答 2

3

几天前在 Datomic 邮件列表上提出了一个类似的问题:

https://groups.google.com/d/topic/datomic/7uOl-TISdxA/discussion

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

于 2012-09-18T15:38:52.160 回答
1

鉴于 2019 年 6 月添加到 Datomic 的新功能,这里接受的答案现在不再是完整的故事。有时您仍想具体化这种关系,但现在还有另一种选择:异构元组

一个属性值,即5 元组v中的eavto,现在本身可以是一个元组。

这是一个最大长度为 8 的 clojure 向量。由于最大长度为 8,这不是存储任意数量的关系元数据的方法。

方博文公告。

在推特上讨论发布。

在你的情况下:

{:db/ident       :person/hobby
 :db/valueType   :db.type/tuple
 :db/tupleTypes  [:db.type/ref :db.type/long] ; hobby, priority
 :db/cardinality :db.cardinality/many}

要在数据记录中使用它,您可以使用tupleuntuple函数。

最好使用像数组这样的元组,其中元组真正代表复合数据。事实上,文档中的示例应该是针对这些异质元组的,实际上使用的是同质数据,所以我认为这真的取决于 datomic 的用户如何做出这些选择。

在 sql 世界中,通常如果数据是不同类型的,那么将其视为数组可能不是一个好主意,因为对于初学者来说,从查询语言中操作这些数据结构时会失去能力。Datomic 可能不完全等同,因为它是一个图形数据库,也许这仍然是相对未知的领域。

于 2020-04-24T11:17:11.897 回答