【问题标题】:DynamoDB query all users sorted by nameDynamoDB 查询按名称排序的所有用户
【发布时间】:2021-02-22 06:32:11
【问题描述】:

我正在对我的应用程序的数据进行建模以使用 DynamoDB。 我的数据模型相当简单:

  • 我有用户和项目
  • 每个用户可以有多个项目

用户可以是数百万,每个用户的项目可以是数千。

我的访问模式也比较简单:

  1. 通过 id 获取用户
  2. 获取按名称或创建日期排序的分页用户列表
  3. 通过 id 获取项目
  4. 按日期排序的用户获取项目

我的这个数据模型的单表如下:

我可以使用表 PK/SK 和 GSI 轻松实现我的所有访问模式,但我对第 2 个问题有疑问。 根据文档和最佳实践,获取分页用户的排序列表:

  • 我无法使用扫描,因为不支持排序
  • 我不应该使用带有 PK 的 GSI,它会将我的所有用户放在同一个分区中(例如 GSI PK = "sorted_user", SK = "name"),因为这会使我的单个分区变热并且无法扩展
  • 我无法创建“组织”类型的新实体,将所有用户放入其中,并通过 PK =“org” 进行查询,因为这会出现与上述相同的热分区问题

我可以存储用户并使用write sharding,但我真的不知道如何实际查询分页排序的用户,因为存储桶 PK 可能需要是随机的,我必须查询所有存储桶才能将所有用户排序在一起。我还认为桶 PK 可以是字母,但这也可能会产生热分区,因为字母“A”可能会受到很大的打击。

我的应用程序模型相当简单。但是,在阅读了所有文档和最佳实践并观看了许多在线视频之后,我发现自己陷入了 DynamoDB 似乎无法很好支持的最基本用例中。我想对于几乎任何现代应用程序来说,必须在某种管理面板中获取用户列表一定很常见。

在这种情况下其他人会怎么做?我真的很想使用 DynamoDB 来获得它带来的所有好处,尤其是在成本方面。

编辑

因为有人问我,在我的应用程序中,2) 的主要用例是这样的:https://stackoverflow.com/users?tab=Reputation&filter=all。 至于规模,它需要很好地扩展,至少到几万。

【问题讨论】:

  • 我不确定 2) 的用例,因为具有数百万用户的应用程序的管理面板通过这些分页似乎不切实际:-) - 也许还有另一种表达方式您的需求可以更轻松地实现,同时仍然足以满足您的需求。
  • 我们需要两个 GSI,一个 by_name PK 为 'name' ,第二个 by_date PK 为 created_date 并使用query 操作进行分页
  • @Maurice,它不一定是管理面板,在我的应用程序中,主要用例是这样的:stackoverflow.com/users?tab=Reputation&filter=all。至于规模,它需要很好地扩展,至少到数万。
  • @BaluVyamajala,这将如何满足访问模式 2)?要使用您建议的 GSI,应用程序需要知道用户的名称和创建日期(作为 PK)并由他们查询。你说的是SK吗?在这种情况下,你会使用哪个 PK?

标签: amazon-web-services sorting database-design amazon-dynamodb


【解决方案1】:

我还认为桶 PK 可以是字母,但是 也可以创建热分区,因为字母“A”会 可能会受到很大的打击。

我认为这听起来是一种合理的方法。

美国社会保障局在其网站上公布姓名数据。早在 1879 年,您就可以download the list of name data!我偶然发现了一个来自data scientist and linguist Joshua Falk 的网站,该网站绘制了来自 SSA 的婴儿姓名数据,这可以让我们了解姓名的首字母是如何分布的。

您的用户可能并不都来自美国,但这可以让我们了解如果按首字母划分名称可能会如何分布。

虽然分布不完全均匀,但对于您的用例来说可能已经足够接近了?如果没有,您可以使用名称的前两个(或三个,或四个...)字母作为分区键来进一步分发数据。

100 万个名称可能不超过几 MB 的数据,这不是很多。基于名称前缀的分区似乎是一种合理的方法。

您也可以考虑使用像 ElasticSearch 这样的工具,它可以支持您的第二种访问模式等等。

【讨论】:

  • 谢谢,这是有趣的数据。我想前端应用层需要确保每次都不会将字母A作为默认初始页面进行查询,否则该分区将比其他分区受到更多的打击。
猜你喜欢
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-13
  • 2020-03-12
  • 1970-01-01
  • 1970-01-01
  • 2018-06-01
相关资源
最近更新 更多