使用单table设计查询DynamoDB中的所有用户
Query all users in DynamoDB with a single-table design
我有一个简单的单一 table 设计,我想在未来保持灵活性,我目前有 2 种实体类型:用户和视频。用户与视频有 1:n 关系。
table 的分区键是 pk
,排序键是 sk
。
用户:pk=u#<id> and sk=u#<id>
、entityType: user
视频:pk=u#<id> and sk=v#<id>
、entityType: video
如果我想获取所有用户,使用 PK=entityType
和 SK=sk
创建 GSI 是否有意义?
这是您可以采用的一种方法,它可以完成工作,但它有一些 drawbacks/side 效果:
- 您还会复制该 GSI 中的所有视频,这会增加它的存储和吞吐量成本
- 您可能会创建一个包含所有用户的潜在 巨大 项集合,这可能会导致热分区并且可能无法很好地扩展。
相反,请考虑将 GSI 中的巨大用户分区拆分为多个具有可预测键的分区。
如果您打算稍后按用户名列出您的用户,您可以将他们用户名的首字母作为分区键,从而创建大约 26 个(取决于大小写和字符集)不同的分区,这将分散加载好多了。要列出所有用户,您必须对所有分区发出查询,这在小规模时很烦人,但可扩展性更强。
另一种选择是定义您希望将用户分布在 n
个分区中,然后使用 hash(user_id) mod n
之类的东西来获取 GSI 的分区键。这样你就必须执行 n
查询才能获取所有分区的值。
不,因为所有用户写入都将转到同一个 PK,这并不理想。相反,设置一个带有 GSI1PK 的 GSI 保存您的用户 ID,您可以对其进行扫描。项目中的必备属性。仅为用户实体类型设置 GSI1PK,因此它是一个稀疏 GSI。
我有一个简单的单一 table 设计,我想在未来保持灵活性,我目前有 2 种实体类型:用户和视频。用户与视频有 1:n 关系。
table 的分区键是 pk
,排序键是 sk
。
用户:pk=u#<id> and sk=u#<id>
、entityType: user
视频:pk=u#<id> and sk=v#<id>
、entityType: video
如果我想获取所有用户,使用 PK=entityType
和 SK=sk
创建 GSI 是否有意义?
这是您可以采用的一种方法,它可以完成工作,但它有一些 drawbacks/side 效果:
- 您还会复制该 GSI 中的所有视频,这会增加它的存储和吞吐量成本
- 您可能会创建一个包含所有用户的潜在 巨大 项集合,这可能会导致热分区并且可能无法很好地扩展。
相反,请考虑将 GSI 中的巨大用户分区拆分为多个具有可预测键的分区。
如果您打算稍后按用户名列出您的用户,您可以将他们用户名的首字母作为分区键,从而创建大约 26 个(取决于大小写和字符集)不同的分区,这将分散加载好多了。要列出所有用户,您必须对所有分区发出查询,这在小规模时很烦人,但可扩展性更强。
另一种选择是定义您希望将用户分布在 n
个分区中,然后使用 hash(user_id) mod n
之类的东西来获取 GSI 的分区键。这样你就必须执行 n
查询才能获取所有分区的值。
不,因为所有用户写入都将转到同一个 PK,这并不理想。相反,设置一个带有 GSI1PK 的 GSI 保存您的用户 ID,您可以对其进行扫描。项目中的必备属性。仅为用户实体类型设置 GSI1PK,因此它是一个稀疏 GSI。