Amazon dynamodb DynamoDB如何查询重叠的时间范围

Amazon dynamodb DynamoDB如何查询重叠的时间范围,amazon-dynamodb,Amazon Dynamodb,考虑由一个主键和两个描述开始日期和结束日期的属性组成的DynamoDB表。如何在不扫描整个表的情况下查询时间范围是否与表中的时间范围重叠 例如: 迪纳摩表有两项记录 PK Start End A 2019-01-01 2019-10-01 B 2019-06-01 2019-08-01 查询哪些记录与2018-02-01到2019-03-01的时间范围重叠。老实说,我不确定DynamoDB是否是此类用例的正确解决方案。您无疑知道,DynamoDB无法在查询中使用

考虑由一个主键和两个描述开始日期和结束日期的属性组成的DynamoDB表。如何在不扫描整个表的情况下查询时间范围是否与表中的时间范围重叠

例如: 迪纳摩表有两项记录

PK  Start        End
A   2019-01-01   2019-10-01
B   2019-06-01   2019-08-01

查询哪些记录与2018-02-01到2019-03-01的时间范围重叠。

老实说,我不确定DynamoDB是否是此类用例的正确解决方案。

您无疑知道,DynamoDB无法在查询中使用多个索引。
在大多数数据库中,您可以在“开始”和“结束”列上放置索引,数据库引擎将能够相当快地确定匹配记录的交集

为了替代此功能,我们需要一种将范围信息编码到单个可转位字段中的方法

这样做的方法是利用“Z顺序索引”。
Z顺序索引是一种编码多维信息的方法

Z顺序索引,以及如何将其应用于DynamoDB,在这篇亚马逊博客文章中有详细描述。

基本上,它的工作方式是将要查询的字段中的数据交错,您可以在二进制级别或字符串级别执行此操作。
将其应用于日期范围字符串的一种基本方法是将范围“20190101”到“20191001”交错到单个字段“2200119901100011”中

然后,要查询“20190502”和“20190905”之间的日期,请使用这两个日期之间的公共前缀,在结束范围中添加一个前缀(使用二进制表示,这方面的逻辑更简单)

在“22001199005”和“2200119901”之间交错,开始>=“20190502”和结束<“20190905”
请注意,单独使用交错索引仍然是近似的,您仍然需要为开始和结束范围定义明确的条件。
但是,这种方法避免了扫描整个表。

当然,如果查询一个很大的日期范围,它最终可能会查询整个表,范围越小,索引的效率就越高。

我同意,在关系数据库中这样做非常容易。但是从aws reinvent关于Dynamodb()的高级设计模式的讨论中,他们一直在说,仅仅因为这是一个非关系数据库并不意味着你不能在它上运行关系工作负载。到目前为止,我读到的所有内容都表明这是不可能的。为此,索引需要使用二进制空间分区(间隔分区),这在b树中是不可能的。
start     end       interleaved
20190101  20191001  2200119901100011
20190601  20190801  2200119900680011
interleaved BETWEEN "22001199005" AND "2200119901" AND start >= "20190502" AND end < "20190905"