Amazon dynamodb 查询DynamoDB中每个ID的最新记录

Amazon dynamodb 查询DynamoDB中每个ID的最新记录,amazon-dynamodb,Amazon Dynamodb,我们有这样一张桌子: user_id | video_id | timestamp 1 2 3 1 3 4 1 3 5 2 1 1 response = self.history_table.query( KeyConditionExpression=Key('user_i

我们有这样一张桌子:

user_id | video_id | timestamp
      1          2           3
      1          3           4
      1          3           5
      2          1           1
response = self.history_table.query(
            KeyConditionExpression=Key('user_id').eq(int(user_id)),
            IndexName='WatchHistoryByTimestamp',
            ScanIndexForward=False,
        )
我们需要查询特定用户观看的每个视频的最新时间戳

目前是这样做的:

user_id | video_id | timestamp
      1          2           3
      1          3           4
      1          3           5
      2          1           1
response = self.history_table.query(
            KeyConditionExpression=Key('user_id').eq(int(user_id)),
            IndexName='WatchHistoryByTimestamp',
            ScanIndexForward=False,
        )
它查询指定用户的所有视频的所有时间戳,但它确实会给数据库带来巨大的负载,因为数千个视频可能有数千个时间戳


我试图在Internet上找到解决方案,但正如我所看到的,所有SQL解决方案都使用GROUP BY,但DynamoDB没有此类功能

我知道有两种方法可以做到这一点:

方法1 GSI全球二级指数

GroupBy有点像DynamoDB中的分区(但不是真的)。您的分区当前是
user\u id
,但您希望
video\u id
作为分区键,而
timestamp
作为排序键。您可以创建一个新的GSI,并指定新的排序键
时间戳
&分区键
视频id
。这使您能够查询给定的视频、最新的时间戳,因为此查询仅使用1个RCU,而且速度非常快,只需添加
--最大项目1--页面大小1
。但是您需要提供
视频\u id

方法2稀疏索引

1的问题是您需要提供一个ID,而您可能只想要一个带有最新时间戳的视频列表。有两种方法可以做到这一点,我喜欢的一种方法是使用稀疏索引,如果您有一个名为
latest
&的属性,为latest
timestamp
设置为true,您可以创建一个GSI并选择该属性键
latest
,但您不必自己手动设置和取消设置该值,您必须在lambda streams或您的应用程序中执行此操作


这看起来很奇怪,但这就是NoSQL相对于SQL的工作方式,我自己现在正在一个当前项目中与之斗争,在这个项目中我不得不自己使用其中一些技术,每次我这样做都感觉不太对劲,但希望我们能习惯。

哦,是的,顺便说一句,记住你必须在创建表时制作一个LSI,如果你是在事后做的话,这可能会有点烦人。如何维护一个最新的表,我们只保存最新的记录,并在新记录到达时不断更新。通过这种方式,可能不需要创建索引?除了其他字段外,主表和最新表都将具有键和排序键。。将所有日期范围查询定向到主表;并查询-latest表以获取最新记录。是的,这是另一种合法的方法,这完全取决于您的用例,如果您想对所有值进行排序,您需要一个索引,如果您想维护一个小子集,在Lambda流中执行您建议的操作可能会更好。