我想将游戏结果存储在DynamoDB表中。每个用户都有一次尝试,并以自己的分数进入表格。
比赛结束后,我必须显示一个排名。因此,我需要所有的用户条目按分数排序。
我的第一次尝试是这样的:
Game | UserID | Score
0 | 101 | 222
0 | 202 | 44
0 | 303 | 345其中游戏是散列键,得分是范围键。
要获得排序的主板/高分,我只需提交这样的查询:
Hash key == 0好的!它也适用于排名的某些部分;我只需在查询中使用范围键和一个限制。
据我所知,我的游戏哈希键被认为是“热键”,这会导致瓶颈和节流。
我使用相同的哈希键估计有100万个条目。
有趣的是,amazon还提供了一些具有相同方法的教程(GameID作为哈希键)。
这是一个有效的方法,还是有任何其他解决方案,以分散散列键,但仍然有一个排序的分数?
谢谢!
发布于 2014-10-25 15:42:58
Amazon的例子是假设有许多不同的游戏,所以写在不同的散列键上。听起来你是说你只有一个或极少数的游戏ids,所以你描述的表格结构对你来说可能是个问题。还请记住,“对于具有本地辅助索引的表,项集合大小有限制:对于每个不同的散列键值,所有表和索引项的总大小不能超过10 GB。这可能会限制每个哈希值的范围键数”(AWS开发人员指南:限制)。
你怎么能改进这个?您可以将分数分割为范围并将范围添加到散列键中。例如:
Game+ScoreBlock | Score | UserID
0+0 | 44 | 202
0+2 | 222 | 101
0+3 | 345 | 303其中,Game+ScoreBlock是您的哈希键,而得分是您的范围键。在这里,ScoreBlock = score (score/100),但是您可以根据您的分数范围选择适当的除数。要查询这一点,您可以单独跟踪当前存在的最高分数块。然后,要获得从最高到最低的分数,您可以查询最高的分块,然后再查询下一个最高的分数,以此类推。实际上,在你找到N个最高分之后,你会停下来,所以这并不像听起来那么糟糕。
https://stackoverflow.com/questions/26514730
复制相似问题