Amazon dynamodb 按日期范围查询dynamoDB

Amazon dynamodb 按日期范围查询dynamoDB,amazon-dynamodb,Amazon Dynamodb,我正在开发一个允许用户阅读书籍的应用程序。我正在使用DynamoDB来存储用户阅读的书籍的详细信息,我计划使用DynamoDB中存储的数据来计算统计数据,如趋势书籍、作者等 我当前的架构如下所示: user_id | timestamp | book_id | author_id user_id是分区键,timestamp是排序键 我遇到的问题是,使用这个模式,我只能查询 单个用户(分区键)已阅读的书籍的详细信息。这是对我的要求之一 另一个要求是查询在特定日期范围内创建的所有记录,例如:在过

我正在开发一个允许用户阅读书籍的应用程序。我正在使用DynamoDB来存储用户阅读的书籍的详细信息,我计划使用DynamoDB中存储的数据来计算统计数据,如趋势书籍、作者等

我当前的架构如下所示:

user_id | timestamp | book_id | author_id 
user_id是分区键,timestamp是排序键

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

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

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

  • 检索单个用户阅读的书籍记录(可以完成)
  • 检索所有用户在过去x天内阅读的书籍记录(无法执行)

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

一个简单的解决方案是创建一个GSI,在所有书籍中使用常量哈希键,并将时间戳作为范围键。这将允许您执行您的查询类型

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


我还建议为这个用例研究其他工具(不是DynamoDB),因为DDB不是数据分析的最佳工具。例如,您可以将DynamoDB数据输入CloudSearch或ElasticSearch并在其中进行分析。

一个解决方案可以是使用GSI并包括两个以上的列,当您接收记录时,请接收日期作为主键,例如2017-07-02,时间戳作为范围键04:22:33:000

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

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


日期差异您需要根据检查点表和当前日期进行计算,以便按天获取数据。

创建一组哈希键不是一个选项,因为如果两个用户在完全相同的时间阅读一本书,时间戳的值将是相同的,如果两条记录以相同的哈希结束,则不会保存。正如您所提到的,我也开始相信dynamodb并不最适合这个用例。如果您在每个时间戳的末尾附加一个长度一定的随机噪声,那么这个边缘情况很容易避免。您是否找到了一个好的解决方案。因为我有完全相同的场景。除了扫描,你还发现什么了吗?