数据库中的合格关系

时间:2012-09-16 03:22:19

标签: many-to-many data-modeling datomic

在关系数据库中,我可以有一个表Person和一个表Hobby。每个人都可以拥有零,一个或多个爱好,而且我还想记录每个人的优先级

我可以使用2个外键PersonFKHobbyFK以及一个普通列Priority创建关系表

在datomic中,为了建模一个简单的n:m关系(没有优先级),我可能会创建一个基数为Reference 的{strong 1}类型的属性,我将用于Many个实体。

但是我如何才能限定该关系才能存储优先级?是否必须类似于关系情况,即通过为该关系创建新的实体类型?还是有更好的方法吗?使用一些元数据工具还是什么?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

鉴于2019年6月向Datomic添加了一项新功能,因此,这里已被接受的答案不再是完整的故事。有时您仍想证明这种关系,但现在还有另一种选择:heterogenous tuples < / p>

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

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

blog post官方公告。

twitter上讨论发行版本。

在您的情况下:

{: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函数。

最好使用像数组这样的元组,其中元组实际上代表复合数据。确实,文档中的示例假定这些 hetero 通用元组实际上使用了 homo 通用数据,因此,我认为这完全取决于datomic的用户如何选择这些选择。

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