DynamoDB - 多范围键
DynamoDB - Multiple range keys
我们可以在 DynamoDB 中有 2 个以上的字段作为主键吗?
或者我可以为我想作为范围键的每个字段创建本地二级索引并同时构建具有多个范围键的查询吗?
在 DynamoDB 中您只能有 2 个字段作为主键。如果您想要多个不同的范围键,您可以为每个键创建一个本地二级索引,但您仍然一次只能查询 1 个索引。您也可以在 table 上只放置 5 个 LSI。
您要建模的数据是什么?您需要支持哪些查询模式?
鉴于您所说的细节,我相信您需要的是具有复合索引的 GSI。您的 table 看起来像这样:
Partition Key GSI Partition GSI Sort
ID ID Type+Timestamp
有了它,您可以使用如下过滤器表达式查询 GSI:
#pk = :pk AND begins_with(#sk, :type)
您的 ExpressionAttributeNames
需要将 #pk
映射到 ID 字段,并将 #sk
映射到复合字段的名称。
您的 ExpressionAttributeValues
需要将 :type
映射到您正在搜索的值("Read" 或 "Unread")。
因为您是按类型(排序键的第一部分)进行过滤,所以排序键的第一部分将始终相同,因此时间戳将用于结果的排序。
我们可以在 DynamoDB 中有 2 个以上的字段作为主键吗?
或者我可以为我想作为范围键的每个字段创建本地二级索引并同时构建具有多个范围键的查询吗?
在 DynamoDB 中您只能有 2 个字段作为主键。如果您想要多个不同的范围键,您可以为每个键创建一个本地二级索引,但您仍然一次只能查询 1 个索引。您也可以在 table 上只放置 5 个 LSI。
您要建模的数据是什么?您需要支持哪些查询模式?
鉴于您所说的细节,我相信您需要的是具有复合索引的 GSI。您的 table 看起来像这样:
Partition Key GSI Partition GSI Sort
ID ID Type+Timestamp
有了它,您可以使用如下过滤器表达式查询 GSI:
#pk = :pk AND begins_with(#sk, :type)
您的 ExpressionAttributeNames
需要将 #pk
映射到 ID 字段,并将 #sk
映射到复合字段的名称。
您的 ExpressionAttributeValues
需要将 :type
映射到您正在搜索的值("Read" 或 "Unread")。
因为您是按类型(排序键的第一部分)进行过滤,所以排序键的第一部分将始终相同,因此时间戳将用于结果的排序。