6

在 Datomic 中,您如何有效地执行诸如“查找所有居住在华盛顿的 50 岁以上的人”(城市和年龄可能会有所不同)之类的查询?在关系数据库和大多数 NoSQL 数据库中,您为此目的使用复合索引;据我所知,Datomic 不支持这样的东西。

我构建了几个中型 Web 应用程序,如果不是用于复合索引,没有一个可以足够快地执行。Datomic 用户如何处理这个问题?还是他们只是在玩小到不会受此影响的数据集?我错过了什么吗?

4

3 回答 3

3

由于 Datomic 中数据(datoms)的结构,这个问题及其解决方案在 Datomic 中并不相同。有两个性能特征/策略可能会为此添加一些阴影:

(1) 当您在 Datomic 中获取数据时,您会从索引树(而不是单个项目)中获取整个叶段 - 段可能由数千个 datom 组成。然后它会自动缓存,这样您就不必通过网络来获取更多的 datoms。

如果您正在查询一个人(即一个实体)的年龄和居住地,很可能查询的 EAVT 或 AEVT 索引导航可能已经缓存了您需要的所有内容。您已经有效地缓存了 datom、如何导航到它以及相关的 datom(按索引中的位置)。

(2)分区可以提供一种手动方式来指定引用的位置。分区会影响实体 ID 的值(它以高位编码)并确保相关实体彼此靠近排序。因此,对于上述问题的替代实现,如果您需要来自城市和人员实体的信息,您可以将它们包含在同一个分区中。

于 2014-12-16T23:51:44.523 回答
2

我写了一个库来处理这个:https ://github.com/arohner/datomic-compound-index

于 2015-03-31T23:10:42.537 回答
0

2019-06-28 更新:由于0.9.5927(Datomic On-Prem) / 480-8770(Datomic Cloud),Datomic 支持元组作为新的属性类型,它允许您拥有复合索引。

于 2019-06-28T16:42:10.183 回答