有没有办法在 DynamoDB 中同时使用主分区键和 GSI?

问题描述 投票:0回答:2

我正在寻找改进以下查询扫描的方法。我需要根据3个键进行查询

  1. 主分区键
  2. GSI 分区键
  3. GSI 排序键

DynamoDB 在关键条件表达式中仅允许 2 个条件。我必须使用过滤器表达式,它会扫描太多记录。

我还在考虑在 GSI 中组合 2 个键作为排序键作为替代方案。这是正确的方法吗?

aws dynamodb query \
--table-name bundles \
--index-name GSI-RegulationSidBundleStatus \
--key-condition-expression "RegulationSid = :regulationSid AND BundleStatus = :bundleStatus" \
--filter-expression "AccountSid = :accountSid" \
--expression-attribute-values '{
  ":accountSid": {
    "S": "XXXXXXXXXXXXXXXXXXXXXXXXXXX"
  },
  ":regulationSid": {
    "S": "YYYYYYYYYYYYYYYYYYYYYYYYYYY"
  },
  ":bundleStatus": {
    "S": "APPROVED"
  }
}'
amazon-dynamodb
2个回答
1
投票

是的,将多个键添加到分区键或排序键中是一种常见模式。为了帮助识别密钥,通常在每个密钥前添加密钥类型或缩写作为前缀,后跟哈希值以及每个密钥之间的哈希值。

对于您的情况,排序键类似于:

r#${RegulationSid}#b${BundleStatus}
。 这对于分区键来说也很常见,即使您只有一个键。对于您的情况:
a#${AccountSid}

在决定是否重载分区键或排序键以及键的顺序时,请查看您的访问模式。如果您知道您有一个获取所有法规的模式,那么您需要将此密钥放在第一位。或者,如果您知道需要获取给定捆绑包状态的所有法规,请将捆绑包状态放在第一位。然后,您可以使用

begins_with
查询来获取这些项目列表,重复使用相同的 GSI。

在代码文档中,您可以列出使用的缩写,以确保不会对多个键类型使用相同的缩写。

我建议始终将客户帐户 ID 作为分区键中的第一个键。如果您稍后决定使用领先键行级授权,这会派上用场。


0
投票

如果您想使用排序键,DynamoDB 在查询数据时仅允许其中一种组合。

 1. Primary Partition key + Sort Key
    OR
 2. GSI Partition key + GSI Sort Key

作为另一种选择,您可以将两个密钥合并为一个密钥并保存到表中。稍后您可以使用组合列来查询数据。

这有助于使用 python 查询 DynamoDB。 https://www.youtube.com/watch?v=x8IxY4zoBGI

© www.soinside.com 2019 - 2024. All rights reserved.