如何为这个 DynamoDB table 设计一个 GSI?

How to design a GSI for this DynamoDB table?

这是一个 AWS 认证的示例问题,我试图在脑海中澄清。问题是为了能够创建一个排行榜,我可以在其中按用户或游戏查询 TopScores,我需要更新此 table 以支持此新问题:

A popular multiplayer online game is using an Amazon DynamoDB table named GameScore to track users’ scores. The table is configured with a partition key UserId and a sort key GameTitle as shown in the diagram below:

答案自然是 GSI,因为它已经存在 table,但答案是建议创建一个名为 GameTitleIndex 的索引,其中包含 GameTitleTopScore

我觉得这是不正确的,因为如果我用 JUST TopScore 创建 GSI - 主键已经被投影(因此它已经包含 UserIdGameTitle)。

人们有什么建议?

考虑一下您的访问模式。如果将分数作为分区键,您将无法表达对给定游戏的最高分数的查询。仅仅因为属性被投影并不意味着它被适当地编入索引。

这与是否将主键投影到 GSI 无关(它们会投影),但拥有索引的真正意义 是查询基 [=31 的主键以外的属性=].

换句话说,在创建 GSI 之后,UserID 和 GameTitle 尽管会被投影,但 UserId 不会是主键,或者 GameTitle 会是 GSI 中的排序键(当然不会)。

假设您有这样的需求:-

Find the top score for the game Galaxy Invaders?

Which user has the highest score for Galaxy Invaders?

你打算怎么查询 GSI 只根据 TopScores,这没有意义。 但是,如果您将 GameTitle 作为 pk 并将 Scores 作为 GSI 的排序键,您可以轻松地根据游戏标题进行查询并找到最高分,甚至是该游戏中得分最高的用户。

你应该尽量记住问题的原始要求Create a leaderboard where I can query the TopScores by User or by Game

docs for query operation 以便更好地理解查询如何帮助基于 pk

获取多条记录