按日期范围查询dynamoDB

5

我正在开发一款应用程序,允许用户阅读图书。我使用 DynamoDB 存储用户阅读的书籍详情,并计划使用存储在 DynamoDB 中的数据来计算统计信息,例如热门图书、作者等。

我的当前模式如下:

user_id | timestamp | book_id | author_id 

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

我的问题在于,使用此模式只能查询单个用户(分区键)阅读的书籍详细信息。这是我其中一个要求。

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

我已经研究了很多其他选项,但没有找到一种方法来创建模式,使我能够运行两个查询。

  • 检索单个用户阅读的书籍记录(可以完成)。
  • 检索最近x天内所有用户阅读的书籍记录(无法完成)。

我不想运行扫描,因为这样会很昂贵,并且我研究了使用GSI进行时间戳的选项,但它需要我指定哈希键,因此我无法查询在两个日期之间创建的所有记录。


1
你找到了好的解决方案吗?因为我也遇到了完全相同的情况。除了扫描,你还发现了什么吗? - AMBasra
2个回答

3
一个天真的解决方案是创建一个GSI,使用所有书籍的恒定哈希键和时间戳作为范围键。这将允许您执行所需类型的查询。
然而,这种方法存在问题,因为相同的哈希键意味着相同的节点,很可能会成为扩展瓶颈。为了解决这个问题,可以采用分片的方法:创建一组哈希键(例如从1到10),并为每本书分配来自该集合的随机键。然后在进行查询时,您需要进行10个查询并合并结果。您甚至可以使这个集合大小动态化,以便与您的数据一起扩展。
我还建议您寻找其他工具(而不是DynamoDB)来处理此用例,因为DDB不是进行数据分析的最佳工具。例如,您可以将DynamoDB数据提供给CloudSearch或ElasticSearch,并在那里进行分析。

创建一组哈希键不是一个选项,因为如果两个用户在完全相同的时间阅读一本书,时间戳的值将是相同的,如果两条记录最终具有相同的哈希,则无法保存。正如您所提到的,我也开始相信dynamodb并不适合这种用例。 - haris
2
如果在每个时间戳的末尾附加一些随机噪声,则可以轻松避免这种边缘情况。 - Tofig Hasanov

1
一种解决方案是使用GSI并添加两列,每当您摄取一条记录时,请将日期作为主键(例如2017-07-02)和时间戳作为范围键(04:22:33:000)摄入。
维护一个检查点表,其中包含表的进程名称和时间戳。每次从表中读取数据时,您都可以更新检查点表以获取增量数据。如果要获取过去7天的数据,请将时间戳更改为过去7天,并获取过去7天到当前时间之间的数据。
您可以使用查询规范来完成此操作,通过将日期作为分区并使用时间戳之间的关键字作为范围条件。
您需要从检查点表和当前日期计算日期差异,因此可以按日获取数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接