在关系数据库中,我可以有一个表Person
和一个表Hobby
。每个人都可以拥有零,一个或多个爱好,而且我还想记录每个人的优先级。
我可以使用2个外键PersonFK
和HobbyFK
以及一个普通列Priority
创建关系表。
在datomic中,为了建模一个简单的n:m关系(没有优先级),我可能会创建一个基数为Reference
的{strong 1}类型的属性,我将用于Many
个实体。
但是我如何才能限定该关系才能存储优先级?是否必须类似于关系情况,即通过为该关系创建新的实体类型?还是有更好的方法吗?使用一些元数据工具还是什么?
答案 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}
要在数据记录中使用此功能,可以使用tuple和untuple函数。
最好使用像数组这样的元组,其中元组实际上代表复合数据。确实,文档中的示例假定这些 hetero 通用元组实际上使用了 homo 通用数据,因此,我认为这完全取决于datomic的用户如何选择这些选择。
在sql世界中,通常,如果数据属于不同类型,则将其视为数组可能不是一个好主意,因为对于初学者来说,由于从查询中操作这些数据结构时会失去能力,语言。 Datomic可能不完全等效,因为它是一个图形数据库,也许这仍然是一个相对未知的领域。