在 Datomic 中,您如何有效地执行诸如“查找所有居住在华盛顿 50 岁以上的人”(城市和年龄可能会有所不同)之类的查询?在关系数据库和大多数 NoSQL 数据库中,您为此使用复合索引;据我所知,Datomic 不支持这样的事情。
我构建了几个,比如说,中等规模的网络应用程序,如果不是复合索引,没有一个可以足够快地执行。 Datomic 用户如何处理这个问题?或者他们只是在玩足够小的数据集而不会受到这种影响?我错过了什么吗?
最佳答案
由于 Datomic 中数据(数据)的结构,此问题及其解决方案在 Datomic 中并不相同。有两个性能特征/策略可能会为此添加一些阴影:
(1) 当您在 Datomic 中获取数据时,您会从索引树中获取整个叶段(不是单个项目)——这些段可能由数千个数据组成。然后它会自动缓存,这样您就不必通过网络访问以获得更多数据。
如果您正在查询一个人 - 即单个实体,了解他们的年龄和居住地,则 EAVT 或 AEVT 索引的查询导航很可能已缓存了您需要的所有内容。您已经有效地缓存了数据、如何导航到它以及相关数据(按索引中的位置)。
(2) Partitions可以提供手动方式来指定引用位置。分区会影响实体 ID 的值(它以高位编码)并确保相关实体彼此靠近排序。因此,对于上述问题的另一种实现方式,如果您需要来自 city 和 person 实体的信息,您可以将它们包含在同一个分区中。
关于indexing - 如果没有复合索引,Datomic 用户如何应对?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24561429/