我们有一个这样的表:
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没有此类功能
答案 0 :(得分:1)
我知道有两种方法可以做到这一点:
方法1 GSI全球二级指数
GroupBy有点像DynamoDB中的分区(但不是真的)。我假设您的分区当前为user_id
,但是您希望video_id
作为分区键,而timestamp
作为排序键。您可以创建一个新的GSI,然后指定新的排序键timestamp
和分区键video_id
。这使您能够查询给定的视频,最新的时间戳,因为此查询仅使用1个RCU,并且只需添加--max-items 1 --page-size 1
即可超快。但是您需要提供video_id
。
方法2稀疏索引
1 的问题是您需要提供一个ID,而您可能只想获取具有最新时间戳的视频列表。有两种方法可以执行此操作,我喜欢的一种方法是使用稀疏索引,如果您有一个名为latest
的属性,并且对于最新的timestamp
将该属性设置为true,则可以创建一个GSI并选择该属性键latest
,但您不必自己手动设置和取消设置此值,而必须在lambda流或应用程序中进行此操作。
这看起来确实很奇怪,但这是NoSQL与SQL相对的工作方式,我本人现在正在与当前项目进行斗争,在SQL中,我每次必须这样做时都必须自己使用其中的一些技术,感觉不对,但希望我们会习惯。