为 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(本地二级索引)按创建和更新时间排序。
一些背景信息:我正在尝试建立一个清单以列出我在各种账户中的 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(本地二级索引)按创建和更新时间排序。