我在 DynamoDB 中创建了一个表审核,其中 userId 和 ProductId 作为 HASH 键。
您已为查看表创建了一个复合主键,其中包含以下分区键userId
和一个排序键 'productId' 。你做到了not创建两个 HASH 键。
从逻辑上讲,您的评论表将如下所示(为了说明目的,我编造了一些数据):
这种表结构可以很容易地获取用户的评论。这是查询所有评论的示例USER#ABC
ddbClient.query(
"TableName": "<YOUR TABLE NAME>",
"KeyConditionExpression": "#userId = :userId",
"ExpressionAttributeValues": {
":userId": {
"S": "USER#ABC"
}
},
"ExpressionAttributeNames": {
"#userId": "userId"
}
)
这将返回由 USER#ABC 审阅的项目集合。
DynamoDB 将not允许您通过以下方式获取项目only指定排序键(例如productId)。你always需要提供分区键。那么如何获得评论过给定产品的用户列表呢?
如果您想搜索评论过单个产品的所有用户,您可以引入一个全局二级索引来交换表的分区键和排序键。这种模式被称为倒排索引 https://aws.amazon.com/getting-started/hands-on/design-a-database-for-a-mobile-app-with-dynamodb/5/#:%7E:text=An%20inverted%20index%20is%20a,primary%20key%20for%20your%20table.。使用上面的示例,倒排索引将如下所示:
这将允许您通过 ProductId 获取用户:
ddbclient.query(
{
"TableName": "<YOUR TABLE NAME>",
"IndexName": "reviews_by_product_index",
"KeyConditionExpression": "#productId = :productId",
"ExpressionAttributeValues": {
":productId": {
"S": "PRODUCT#456"
}
},
"ExpressionAttributeNames": {
"#productId": "productId"
}
}
)
此查询将返回代表评论的两个项目的集合PRODUCT#456
.
使用复合主键时,您can根据条件进行搜索sort key只要您还指定分区键。这有点拗口,但它允许您执行类似(伪代码)的查询
查询其中分区键=“USER#ABC”且排序键begins_with“Product”