DynamoDB 中布尔属性的索引

Index on a Boolean attribute in DynamoDB

我是 DynamoDB 模式设计的新手。我们有一个 table 存储客户的元数据信息,其 HashKey 为 CustomerId。 table 还包括一个名为“isActive”的属性,它不是布尔值。如果客户取消注册,我们计划将 'isActive' 属性设置为空。

我们希望提取所有活动的客户 ID 的列表。我读到 'sparseIndexes',其中我们可以在 'isActive' 属性上创建 GSI,并且只有具有 'non-empty' 值的记录才会填充到 GSI 中。

但是,扫描似乎是检索活动客户 ID 列表的唯一方法。我们可以

  a) Scan entire table and filter only active customerIds at application layer
  b) Scan the GSI which will be smaller than base table, but not necessarily very small (I would expect at least 1000+ records in it).

是否有更好的设计方法来通过实现高基数来解决这个问题?

听起来你对你的选择有相当好的理解。使用 GSI 创建稀疏索引对于您描述的访问模式来说相当普遍。请记住,您可以对索引进行 运行 query 操作(而不是 scan),这将使操作非常快。如果您有很多项目,您可以随时对结果进行分页。

请记住,您可以 add/remove 项目的 GSI 主键 include/exclude 索引中的项目。例如,假设您的 table 有一个 GSI,其分区(哈希)键名为 GSI1PK。下面是定义了 4 个客户项目后的样子:

请注意,只有 Joe 和 Jill 定义了 GSI1PK 值,而 Sue 和 Sam 没有。由于我在 GSI1PK 上定义了全局二级索引,因此只有定义了该属性的项目才会投影到该索引中。从逻辑上讲,该索引将如下所示:

如果您想从 GSI1 中删除 Joe 或 Jill,只需将这些项目中的项目更新为 REMOVE GSI1PK。同样,如果您想将 Sue 或 Sam 添加到索引中,请将项目更新为 ADD 这些项目的 GSI1PK 属性。