在没有hashkey或扫描的情况下在Dynamo DB中查询

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

我希望在没有HashKey的情况下查询Dynamo DB。我尝试过使用扫描,但它很昂贵,所以寻找其他一些替代品。

amazon-dynamodb
2个回答
27
投票

我首先要说的是,在不知道哈希密钥的情况下查询DynamoDB表是不可能的。这是有道理的。

现在,您要使用的哈希键是否是表的主键,取决于您。

例如,假设您有下表:

╔══════════════════════╦════════════════════════╦════════════════╗
║ course_id (Hash Key) ║      course_name       ║    teacher     ║
╠══════════════════════╬════════════════════════╬════════════════╣
║ 324234               ║ Node.js for Dummies    ║ Ryan Dahl      ║
║ 213323               ║ How to train your cat  ║ Jackson Galaxy ║
║ 324090               ║ Cat Logic              ║ Jackson Galaxy ║
║ 763298               ║ Diving into .NET       ║ Eric Lippert   ║
╚══════════════════════╩════════════════════════╩════════════════╝

表的主键和散列键是course_id,这很好。提供唯一的哈希键允许将表拆分为多个分区。

但是,如果我们想要获得Jackson Galaxy所教授的所有课程怎么办?

我们不知道这些课程的course_id,这就是我们想要的。所以我们发现自己不知道项目的哈希键值。

这就是GSI发挥作用的地方。全局二级索引允许您为表定义不同的哈希键。请注意,它不会更改主哈希键 - course_id仍将是表的哈希键。

GSI仅提供额外的哈希密钥,以便您能够进行更复杂的查询。

假设我们添加一个名为teacher_index的GSI,我们说teacher将成为我们的哈希键,course_id将成为我们的范围键(我们需要指定一个范围键,因为teacher单独作为哈希键将生成重复的条目)。

现在我们可以查询我们的teacher_index并将Jackson Galaxy作为哈希键值传递。结果将是213323 - How to train your cat324090 - Cat Logic


1
投票

我部分同意Matias发布的答案。您可以在表上创建全局二级索引(使用哈希键和可选范围键)。

但是,我不同意他在后面的回答中所说的内容:“我们需要指定一个范围键,因为仅作为哈希键的教师将生成重复的条目”。我不能在他的回答下面发表评论,因为我没有足够的声誉。出于某种原因,我无法编辑他的答案。

来自AWS docs

全球二级指数不强制执行唯一性

因此,全局二级索引(GSI)的范围键是可选的,GSI的复合键不需要唯一标识任何记录。

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