首页 > 解决方案 > DynamoDB 架构 - 检索所有用户

问题描述

我正在尝试为我的数据建模。如您所见,分区键是用户电子邮件。在全球二级索引中,我有一个“US”的 PK,代表“用户”。如果我想获得所有启用的用户,我只需要查询 GSI1PK = "US" 和 GSI1SK 以 "Enabled" 开头的 GSI。

我担心应用程序中的所有用户都将拥有相同的 GSI1PK。这会是一个问题吗?GSI PK 是否会出现“热分区”问题?我在谷歌上搜索这个,我没有看到一个明确的答案。StackOverflow 上只有一个地方说这将是一个问题,但还有其他地方说它不会。我有点困惑。

在我的表中构造数据的最佳方法是什么,以便我可以访问所有用户而不会导致热分区问题?

DynamoDB 表

标签: amazon-web-servicesamazon-dynamodb

解决方案


将潜在的大型项目集合放在单个分区中可能会导致热分区。理想情况下,您选择的分区键在分区之间均匀分布数据。但是,如何实现这一点可能并不总是很清楚。

您可能会考虑在写入时将大分区拆分为较小的分区(也称为写入分片),并在读取时重新组合它们。例如,在创建 GSIPK 时,您可以在分区键中引入一个 1 到 4 之间随机生成的整数:

在此处输入图像描述

你的 GSI 看起来像这样

在此处输入图像描述

现在,您的用户数据更均匀地分布在各个分区中。从您的表中读取用户时,您将一次从所有分区中提取。这可以并行完成以获得更快的性能。

在此示例中,我选择了一个随机数将数据“写入分片”到单独的分区中。但是,您的数据可能适合更自然的划分(例如,按国家、启用状态、时区等)。我想强调的是,跨分区分配数据的策略可以与用于支持应用程序访问模式的数据模型分开。


推荐阅读