首页 > 解决方案 > 查询 DynamoDB 中每个 ID 的最新记录

问题描述

我们有一个这样的表:

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,
        )

它查询指定用户的所有视频的所有时间戳,但它确实给数据库带来了巨大的负载,因为可能有数千个视频的数千个时间戳。

我试图在互联网上找到解决方案,但正如我所见,所有 SQL 解决方案都使用 GROUP BY,但 DynamoDB 没有这样的功能

标签: amazon-dynamodb

解决方案


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

方法一 GSI 全球二级指数

GroupBy 有点像 DynamoDB 中的分区(但不是真的)。我目前user_id假设您的分区,但您希望video_id作为分区键和timestamp排序键。您可以创建一个新的 GSI,并指定您的新排序键timestamp和分区键video_id。这使您能够查询给定的视频,最新的时间戳,因为这个查询将只使用 1 个 RCU 并且非常快,只需添加--max-items 1 --page-size 1. 但是您需要提供video_id.

方法二稀疏索引

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

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


推荐阅读