Amazon dynamodb 如何有效地获取日期范围的分页查询结果

Amazon dynamodb 如何有效地获取日期范围的分页查询结果,amazon-dynamodb,Amazon Dynamodb,从NoSql开始,特别是DynamodB,我被问到以下问题: 存在一个包含大量行的现有表,其中包含如下字段: RecordId (Guid = partition key) RecordType (Guid = sort key) UserId (Guid) CreationDateTime ... and some other attributes ... 还有一个GSI(如GSI1),具有: 一些用户生成大量具有相同记录类型的行(可能每天数百行或数千行),因此此索引通常具有大量具有相同Us

从NoSql开始,特别是DynamodB,我被问到以下问题:

存在一个包含大量行的现有表,其中包含如下字段:

RecordId (Guid = partition key)
RecordType (Guid = sort key)
UserId (Guid)
CreationDateTime
... and some other attributes ...
还有一个GSI(如GSI1),具有:

一些用户生成大量具有相同记录类型的行(可能每天数百行或数千行),因此此索引通常具有大量具有相同UserId+记录类型的行

我希望能够高效地执行分页查询,以获得与特定UserId+记录类型匹配的结果,并在日期范围内具有CreationDateTime

实现这一目标的最佳方式是什么

有人建议我可以创建第二个GSI(比如GSI2),partitionKey=Userid,Sort key=CreationDateTime。其想法是,这将是一种有效的方法,可以找到所需日期范围内UserId+RecordType的第一行,然后将其用作在GSI1中搜索的起点(PaginationToken)。仅当GSI1中具有重复键的行按创建顺序存储时,此选项才起作用

这有意义吗?如果不是,那么有什么更好的方法呢?

如果您的查询是:“特定用户ID+记录类型和CreationDateTime范围” 所以你对自己说:

创建GSI:

hash=UserId\u记录类型(1234\u类型1)

范围=CreationDateTime

通过这种方式,您可以使用RecordType为用户获取所有文档,并按CreationDateTime排序


小心使用热键。

有趣的是,您可以基于>1属性设置哈希(分区键)吗?或者,您是否建议创建一个包含两个现有属性的新属性?如果是后者,我可能必须在创建索引之前检查所有现有数据并向每一行添加新的复合属性?我会执行后者-“添加新的复合属性”,这也可以在创建索引之后执行。“这也可以在创建索引之后执行”-这可能意味着可以基于>1属性创建索引,否则您将没有此选项。权衡是什么?我对所有这些都不熟悉,所以如果这些都是基本的东西,我很抱歉。在这里创建另一个索引的权衡是成本。另一个索引==表的更多容量单位==$$。如果在使用新值填充文档之前创建索引,则容量较低(因为只有少数文档保留在索引中)。仅当填充了哈希键时才填充索引(无论是否填充了范围键)@Joe分区键只能是一个属性,尽管正如Eyal Ch所说,您可以创建一个连接现有属性的新属性。一些好的资源是:,和。
UserId = partition key
RecordType = sort key