按日期范围查询dynamoDB

按日期范围查询dynamoDB

问题描述:

我正在开发一个允许用户阅读书籍的应用程序。我使用DynamoDB存储的书籍细节,用户读取和我打算使用计算统计数据存储在DynamoDB的数据,如趋势的书籍,作者等按日期范围查询dynamoDB

我目前的架构是这样的:

user_id | timestamp | book_id | author_id 

user_id是分区键,timestamp是排序键。

我遇到的问题是,在这种模式下,我只能查询 单个用户(分区键)已读取的书的详细信息。这是我的要求之一。

另一个要求是查询在某个日期范围内创建的所有记录,例如:在过去7天内创建的记录。有了这个模式,我无法运行这个查询。

我已经研究了很多其他选项,还没有想出一种方法来创建一个允许我运行这两个查询的模式。

  • 检索的单个用户阅读的书籍的记录(可以做到)。
  • 检索所有用户在过去x天内读取的书籍记录(无法执行此操作)。

我不想运行扫描,因为这将是昂贵的,我看着使用GSI的时间戳的选择,但它要求我指定一个散列键,因此我不能查询所有记录在两个日期之间创建。

一个天真的解决方案是创建一个横跨所有书籍和时间戳的恒定散列键作为范围键的GSI。这将允许您执行您的类型的查询。

这种方法的问题是它可能成为一个缩放瓶颈,因为相同的散列键意味着相同的节点。解决此问题的一个解决方法是进行分片:创建一组散列密钥(例如:从1到10),并将此集合中的随机密钥分配给每本书。然后,当您进行查询时,您需要进行10次查询并合并结果。您甚至可以将此设置大小设置为动态,以便随数据进行调整。

因为DDB不是数据分析的最佳工具,所以我还建议寻找其他工具(不是DynamoDB)用于此用例。例如,您可以将DynamoDB数据提供给CloudSearch或ElasticSearch并在那里进行分析。

+0

创建一组散列键是不是一种选择,因为如果用户在读一本书在精确的同一时间,时间戳值将是相同的,如果两个记录具有相同散列结束了,也不会保存。正如你提到的,我也开始相信dynamodb是不是最适合这种使用情况。 –

+0

该边缘情况下,可以如果在每个时间戳的结束追加一些长度的随机噪声很容易地避免。 –

一个解决方案可能是使用GSI,并且包括两个多列,当你摄取一条记录时,会善意摄取日期作为主键,例如2017-07-02和时间戳作为范围键04:22:33:000。

为检查点维护一张表,该表包含表的进程名称和时间戳。每次从表中读取时,都可以更新检查点表以获取增量数据。如果您希望获取最近7天的数据将时间戳更改为过去7日期,并获取最近7天和当前时间之间的数据。

您可以通过传递日期作为分区并在关键字之间使用作为范围条件的时间戳来使用查询规范。

日期差异你会从检查点表和当前日期计算出来,所以明智的你会得到数据。