我想将游戏结果存储在DynamoDB表中。每个用户都有一次尝试,并以他的分数进入表格。
比赛结束后我必须显示排名。因此,我需要按分数排序的所有用户条目。
我的第一次尝试看起来像这样:
Game | UserID | Score
0 | 101 | 222
0 | 202 | 44
0 | 303 | 345
游戏是哈希键,得分 范围键。
要获得排序的排行榜/高分,我只需要提交一个类似的查询:
Hash key == 0
尼斯!它也适用于部分排名;我只需要使用范围键和查询限制。
据我所知,我的游戏哈希密钥被视为"热键",这可能导致瓶颈和数据流。
我估计有一百万个具有相同散列键的条目。
Funnily亚马逊还提供了一些使用相同方法的教程(GameID作为哈希键)。
这是一种有效的方法还是有其他解决方案,可以传播哈希键并且仍然有一个排序分数?
谢谢!
答案 0 :(得分:1)
亚马逊的例子是假设有许多不同的游戏,因此写入分布在不同的散列键上。听起来你说你只有一个或者只有极少数的游戏ID,所以你描述的表结构对你来说可能是一个问题。还要记住"对于具有本地二级索引的表,项目集合大小有限制:对于每个不同的哈希键值,所有表和索引项的总大小不能超过10 GB。根据您的项目大小,这可能会限制每个哈希值的范围键数量#34; (AWS Developer Guide: Limits)。
你怎么能改善这个?您可以将分数分段为范围,并将范围添加到散列键。例如:
Game+ScoreBlock | Score | UserID
0+0 | 44 | 202
0+2 | 222 | 101
0+3 | 345 | 303
Game + ScoreBlock是你的哈希键,分数是你的范围键。这里ScoreBlock = Floor(得分/ 100)但您可以根据您的得分范围选择合适的除数。要查询此信息,您可以单独跟踪当前存在的最高分数块。然后,要获得从最高到最低的分数,您将查询最高分数块,然后查找下一个最高分等等。实际上,你会在找到N个最高分之后停下来,这样就不会听起来那么糟糕。