获取每个分区键的最新/最大值

时间:2018-11-30 01:34:22

标签: java amazon-web-services amazon-dynamodb

该表非常简单,它包含一个组件列表,其中的组件名称为分区键,版本号为排序键。

正如标题所示,我需要获取每个软件包的最新版本,但不能安静地解决如何最好/最有效的方法来实现这一目标?

我曾经考虑过使用日期时间戳作为排序键(版本)或GSI以及版本号,但是我能看到的最好的是,您将不得不为每个表重复查询表分区返回一个有序列表?

我还考虑了使用第二张表存储此信息的可能性。

对如何最好地解决此问题的其他观点感兴趣。任何使用spring-data-dynamo / Java进行操作的提示都很棒。

1 个答案:

答案 0 :(得分:0)

一个可能的解决方案是Sparse Index。基本上,您可以创建一个isLatestVersion之类的属性,例如true,否则项目不具有该属性。然后,您可以创建具有该属性的GSI作为分区键或排序键。只有具有该属性的项目才会出现在GSI中,因此您可以非常快速地扫描GSI。或者,如果您将isLatestVersion用作GSI的分区键,则可以非常方便地查询GSI(例如,获取以“ Foo”开头的所有软件包的最新版本可能很有用……但是我不知道您的其他用例)。

这就是陷阱。您需要确保在添加新版本时,从先前的最新版本中删除了该属性。使用DynamoDB Streams和Lambda函数很容易做到,也可以在从较旧版本中删除属性的同时,使用DynamoDB TransactWriteItems将新包版本添加到表中,但是请务必仔细考虑所有可能更改最新版本的情况。

无论哪种方式,您都需要设计应用程序代码以过滤偶尔出现的重复条目。 (GSI最终是一致的,因此更新最新版本后的时间间隔很短(通常为几毫秒),如果您查询最新的软件包版本,则可能会得到两个最新版本。)