为了账号安全,请及时绑定邮箱和手机立即绑定

根据 GSI 索引和范围键从 Dynamo 数据库中获取所有列

根据 GSI 索引和范围键从 Dynamo 数据库中获取所有列

幕布斯7119047 2023-03-17 10:26:17
我只有两个在 dynamo db GSI 索引级别定义的投影。但要创建预期的响应,我还需要从 dynamo db 获取其他列。假设我的表中有 20 列,全局二级索引中只提到了两列。我如何使用 GSI 和从主表加载数据来实现这一点。我是否需要用户查询请求或我想到的另一种方法是从索引中提取数据然后在主表上搜索。这是我现有的代码:    public List<DynamoDBObject> getData(String gsiHashKey) {        DynamoDBObject dynamoDBObject= new DynamoDBObject();        command.setgsiHashKey(gsiHashKey);     final DynamoDBQueryExpression<DynamoDBObject> queryExpression = new DynamoDBQueryExpression<>();  queryExpression.setIndexName("gsi_index_name");      queryExpression.setHashKeyValues(dynamoDBObject);return mapper.query(DynamoDBObject.class,queryExpression)}请提出实现这一目标的最佳方法。
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

如您所述,在 GSI 中,如果您选择不将所有基表的列投影到索引表中,则在查询索引时这些其他列不可用。这样做的原因不是实施者懒惰,而是效率:在 GSI 中,索引表以与基表不同的方式分布在整个 DynamoDB 集群中,因此在读取索引表数据时,没有有效的方法也可以读取同时从基表。顺便说一下,这正是 LSI 与 GSI 的不同之处 - 在 LSI 中,索引和基表位于同一位置,并且可以一起读取,因此 DynamoDB 确实为您提供了一种方法来请求未投影的列。

所以我认为你有两个选择。一种是BatchGetItem在读取完索引数据后,再请求读取基表数据。请注意,当您查询索引时,您始终可以取回基表键属性,因此您可以使用这些属性从基表中读取完整的项目。BatchGetItem可能是进行这些读取的最有效方法,而不是使用GetItem.

当然,第二个选项是将更多基本属性(甚至全部)投影到索引表中。这会增加你的存储和可能的读写成本,所以你是否要这样做取决于你的应用程序。在某些特定情况下,具有相同属性的两个索引甚至具有不同数量的投影属性也是有意义的。


查看完整回答
反对 回复 2023-03-17
  • 1 回答
  • 0 关注
  • 84 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信