DynamoDB table 结构 - 按没有任何哈希键的数字字段排序

DynamoDB table structure - sort by numeric field without any hash key

我有一堆(编辑:250 万)谜题,我想在 DynamoDB 中存储和查询。

各拼图的相关结构如下:

ID Difficulty OtherString ...
ab 1500 foo1 ...
x0 1645 foo2 ...
c2 1645 foo3 ...
d5 1431 foo4 ...
oz 1500 foo5 ...

每个 ID 都是一个唯一的字符串。每个Difficulty都是一个数值,大致在0-3000之间。还有其他字段,但对这个问题不感兴趣。

在访问模式方面,我需要:

  1. 通过 ID 不时更新这些值。
  2. 获得给定范围内的随机拼图,例如1500 +/- 50。

我认为 IDHASH KEY 一样最好,但不相信我可以将 Difficulty 字段作为 SORT KEY,因为可能存在重复值。没有其他需要对数据进行分区,因此不需要任何其他类型的复合键,imo。

我是否应该只将 ID 作为 HASH KEY 并执行 scan 操作以获得随机拼图,并按 Difficulty 过滤?这可能吗?有没有更好的方法来模拟这些数据?我想在 SORT KEY 中设置难度(以某种方式)将有助于加快搜索速度并使用更少的资源。

非常感谢

我建议创建一个 GSI,将评分作为分区键,将拼图 ID 作为排序键。

鉴于有 250 万个谜题和 3,000 个难度等级,每个等级大约有 1,000 个谜题。

因此,要选择一个评分为 1500 +/- 50 的随机谜题,您首先(在数据库之外,在您的中间件中)随机选择一个在 1450 和 1550 之间使用的评分,然后您对该 GSI PK 进行查询从中选择一个随机拼图的数字。

如何在查询中随机选择?我建议您(再次在数据库之外)随机选择一个适合拼图 ID space(a3r1 或其他)的值,然后对来自的 SK 进行范围查询点向前,限制为1.

如果没有谜题具有所选的难度级别(将难度加一并重试)或查询中不存在谜题 ID(将难度加一并循环以获取头谜题),则添加特殊处理下一个难度)。

结果应该是非常高效且负担得起的。