为 DynamoDB 选择主键

Choosing Primary key for DynamoDB

一些背景信息:我正在尝试建立一个清单以列出我在各种账户中的 AWS 资源,并且我计划使用 DynamoDB 来存储数据。这些将是我的 table 的列:ResourceARN、ResourceName、ResourceType、StandardTag、IsDeleted、LastUpdateTime 和 ResourceCreationDate(此字段仅适用于少数资源类型,如 Ec2)。

问题:我想使用帐户 ID、资源类型和标签名称查询我的 DDB table。我很难为 table 选择主键。由于主键应该是唯一的并且必须具有 1:many 关系。因此,我不能使用 resourceType 和帐户 ID 的组合。我也不能使用 resourceArn 作为我的主键,因为它是 1:1 关系。此外,使用 resourceARN 作为排序键对我来说没有意义。我知道我可以使用简单的扫描操作,但是这非常昂贵,而且如果我在我的 DDB 中添加更多数据会花费时间。

如有任何建议或指导,我将不胜感激。

简答

  • 分区键:账户 ID
  • 排序键:<resource type>/<resource ID>

理由

排序键是连接多个属性的字符串,这是一种常见的模式。由于排序键 can be queried by prefix,您可以在查询中利用它:

  • 获取所有账户资源:查询Account ID分区键上的所有排序键
  • 获取帐户的所有 EC2 实例:使用 partition key = <your account ID>sort key begins_with('ec2-instance') 进行查询。

您可能会注意到 ARN 也遵循这样的 hierarchy(这可能不是巧合)。这将有效地使用 ARN 的子集作为排序键。

一些注意事项:

  • DynamoDB 的 属性 一样多。你不需要在没有它的记录中包含 ResourceCreationDate,这样做会节省你 space(见下一点)。
  • 属性名称算作每个记录的存储空间,这会影响成本和吞吐量。由于这个原因,通常使用 shorthand 作为名称(例如 rct 而不是 ResourceCreationTime)。
  • 如果需要,您可以使用 LSI(本地二级索引)按创建和更新时间排序。