在 DynamoDB 中建模高分数据的最佳方式

Best way to model high score data in DynamoDB

我相信使用我熟悉的 PostgreSQL 或 MongoDB 会更容易,但我在我的项目中使用 DynamoDB 是为了学习如何使用它并感到舒适用它。我以前从未使用过它。

我想使用 DynamoDB 存储我的打字测试项目的高分。有4个数据属性需要存储:

起初,我的分区键是testType,排序键是WPM。然后我意识到,如果有人获得了与以前用户相同的 WPM,它会覆盖以前用户的数据,因为 testType 和 WPM 这两个关键组件是相同的。所以关系不起作用。

现在,name 是我的分区键,WPM 是我的排序键。为了通过 testType 进行过滤,我只是使用 JS 数组过滤方法。尽管出于多种原因,这似乎仍然不是最佳选择。对于我的小型打字测试项目,我认为还可以,但我可以看到2个人输入相同的名称并获得相同的WPM并互相覆盖是可能的。

使用 DynamoDB 进行设置的更好方法是什么?

假设您想要给定测试类型的前 X 个 WPM 结果:

设置分区键为测试类型。将排序键设置为 <WPM>#<username>。确保对 WPM 进行零填充,这样即使分数低于 100,它也始终为 3 位数字。这样可以使其按数字排序。

有了这个键结构,您就有了一个给定测试类型的所有分数的排序列表(在排序键中)。您可以查询测试类型并使用 ScanIndexForward=false 获得降序的高分。

注意不同用户名的多个相同分数不会相互覆盖。可以从返回的排序键或项目的属性中提取用户名,以及有关高分事件的其他元数据。

如果您有多个用户使用相同的用户名,那就有点奇怪了。大概你有一个内部标识符。您可以将其用作排序键中的后缀,而不是用户名。