DynamoDB 架构 - 检索所有用户
DynamoDB Schema - Retrieve All Users
我正在尝试对我的数据建模。如您所见,分区键是用户电子邮件。在全球二级索引中,我有一个“美国”的 PK,它代表“用户”。如果我想获得所有启用的用户,我只需要查询 GSI,其中 GSI1PK = "US" 和 GSI1SK 以 "Enabled" 开头。
我担心应用程序中的所有用户都将拥有相同的 GSI1PK。这会是一个问题吗? GSI 的 PK 会不会出现“热分区”的问题?我正在谷歌搜索,但没有看到明确的答案。 Whosebug 上只有一个地方说这将是一个问题,但还有其他地方说它不会。我有点困惑。
在我的 table 中构建数据的最佳方式是什么,这样我就可以访问所有用户而不会导致热点问题?
将可能很大的项目集合放在单个分区中可能会导致热分区。理想情况下,您选择的分区键可以跨分区均匀分布数据。但是,可能并不总是清楚如何实现这一点。
您可能会考虑在写入时将大分区拆分为较小的分区(也称为写入分片),并在读取时重新组合它们。例如,在创建 GSIPK 时,可以在分区键中引入一个随机生成的 1 到 4 之间的整数:
你的 GSI 看起来像这样
现在您的用户数据更均匀地分布在各个分区中。当从你的 table 中读取用户时,你会一次从所有分区中提取。这可以并行完成以获得更快的性能。
在这个例子中,我选择了一个随机数来将数据“写入碎片”到单独的分区中。但是,您的数据可能适合更自然的划分(例如按国家/地区、启用状态、时区等)。我想强调的是,跨分区分布数据的策略可以与用于支持应用程序访问模式的数据模型分开。
我正在尝试对我的数据建模。如您所见,分区键是用户电子邮件。在全球二级索引中,我有一个“美国”的 PK,它代表“用户”。如果我想获得所有启用的用户,我只需要查询 GSI,其中 GSI1PK = "US" 和 GSI1SK 以 "Enabled" 开头。
我担心应用程序中的所有用户都将拥有相同的 GSI1PK。这会是一个问题吗? GSI 的 PK 会不会出现“热分区”的问题?我正在谷歌搜索,但没有看到明确的答案。 Whosebug 上只有一个地方说这将是一个问题,但还有其他地方说它不会。我有点困惑。
在我的 table 中构建数据的最佳方式是什么,这样我就可以访问所有用户而不会导致热点问题?
将可能很大的项目集合放在单个分区中可能会导致热分区。理想情况下,您选择的分区键可以跨分区均匀分布数据。但是,可能并不总是清楚如何实现这一点。
您可能会考虑在写入时将大分区拆分为较小的分区(也称为写入分片),并在读取时重新组合它们。例如,在创建 GSIPK 时,可以在分区键中引入一个随机生成的 1 到 4 之间的整数:
你的 GSI 看起来像这样
现在您的用户数据更均匀地分布在各个分区中。当从你的 table 中读取用户时,你会一次从所有分区中提取。这可以并行完成以获得更快的性能。
在这个例子中,我选择了一个随机数来将数据“写入碎片”到单独的分区中。但是,您的数据可能适合更自然的划分(例如按国家/地区、启用状态、时区等)。我想强调的是,跨分区分布数据的策略可以与用于支持应用程序访问模式的数据模型分开。