【问题标题】:Show top 10 scores for a game using DynamoDB使用 DynamoDB 显示游戏的前 10 名得分
【发布时间】:2018-06-23 12:16:57
【问题描述】:

我在 DynamoDB 中创建了一个“分数”表来存储游戏的分数。

该表具有以下属性:

  • uuid
  • 用户名
  • 得分
  • 日期时间

现在我想查询游戏(排行榜)的“前 10 名”分数。

在 DynamoDB 中,无法在没有分区键的情况下创建索引。

那么,如何以可扩展的方式执行此查询?

【问题讨论】:

  • 很遗憾,Dynamodb 不支持此用例。
  • 有可能。只需要分数上的排序键。
  • 但是如何在没有分区键的情况下添加排序键?

标签: amazon-web-services amazon-dynamodb scalability


【解决方案1】:

没有。您将始终需要分区键。 DynamoDB 能够大规模提供所需的速度,因为它将具有相同分区键的记录存储在物理上彼此靠近,而不是在 100 个不同的磁盘(或 SSD,甚至服务器)上。

如果您有一个成熟的查询用例(这是 DynamoDB 的设计目的),例如“Top 10 monthly 得分”然后您可以将 datetime 散列到派生的 month 属性中,例如 12/01/2017、01/01/2018、依此类推,然后将其用作您的分区键,以便在同一个月生成的所有分数都将“分桶”到同一分区中,以获得最佳查找性能。然后,您可以保留 score 作为排序键。

您当然可以使用其他表格(或 LSI)来记录每周和每天的分数。或者您甚至可以选择最细粒度的存储桶,并在您的应用程序代码中自己总结结果。您可能需要提取 10 条以上的记录才能使 足够接近 在聚合级别上达到 100% 的准确度……我不知道。测试一下。如果我处理的是金钱/佣金,我不会依赖它,而是关心谁在乎的游戏分数:)

注意:如果您决定使用此路由,则不要使用“12/10/2017”等作为分区值,我会使用整数偏移量,例如UNIX 纪元(四舍五入以表示该月的第一个午夜)以使其更容易计算/编码。我使用友好的日期来更好地说明这种方法。

【讨论】:

  • 很好的解释。如果我想要一个“ALL TIME TOP SCORES”,我想我可以创建另一个表,使用 DUMMY 分区键(例如:所有值设置为同一个分区),但只有当新的分数大于第 10 位的最佳分数。并定期删除低于 10 的分数。这样,尽管所有项目都在同一个分区中,但表中的项目永远不会超过 10 个,因此可以解决可伸缩性问题。对吗?
  • 刚到家,真的坐下来阅读您的评论。我以为你问的是获得前 1 分而不是 10 分。是的,你的方法应该适用于这种情况
  • 我在使用 dynamoDB 创建排行榜时遇到了同样的问题。我只需要所有时间前10名的分数。我有一张类似的桌子。但没有任何查询对我有用。
猜你喜欢
  • 2021-10-22
  • 2020-12-31
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-02
  • 2014-06-17
  • 1970-01-01
相关资源
最近更新 更多