amazon-dynamodb - 查询 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 没有这样的功能
解决方案
我知道有两种方法可以做到这一点:
方法一 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 相比的工作方式,我自己现在在一个当前项目中与之抗争,我不得不自己使用其中一些技术,每次我这样做都感觉不对但希望我们会习惯它。
推荐阅读
- java - 未显示 Spring Boot 验证消息
- java - 在自助服务终端模式下禁用“搜索设置”按钮
- flutter - 阅读我的 pubspec.yaml 文件后,我的应用程序是否使用加密?
- excel - Windows文件夹目录显示同一目录中的两个不同文件组
- excel - 未在汇总表上复制的唯一(过滤器)值
- javascript - 通过上传文件 react-dropzone 来反应 js videoplayer sub
- animation - 来自 @Published 属性的 SwiftUI 动画从视图外部更改
- vb.net - System.InvalidOperationException ExecuteNonQuery 需要打开且可用的连接
- r - 模块内模块闪亮
- bash - 直接调用 Bash 脚本运行良好,但 cron 似乎根本拒绝运行它?