【问题标题】:Querying on Multiple Attributes in Amazon DynamoDB在 Amazon DynamoDB 中查询多个属性
【发布时间】:2019-09-27 21:23:01
【问题描述】:

我正在将我的数据库从 sql 数据库移动到 Dynamodb。我目前有一张包含这些值的表格:

  • tenantId (PartitionKey)
  • resourceId (RangeKey)
  • 类型
  • 角色
  • 姓名

我现在有以下问题:

  • 获取属于类型为t、角色r 且名称包含n 的租户ten 的所有资源。其中 type role name 可能是空值,因此在这种情况下,它们不会用作过滤器。

使用过滤器可以在 dynamodb 中进行此查询,但阅读以下文章https://aws.amazon.com/blogs/database/querying-on-multiple-attributes-in-amazon-dynamodb/ 我意识到这可能是一个昂贵的查询,因为 dynamodb 正在检索这些数据然后过滤服务器端。该页面建议创建具有以下值的 GSI:

  • tenantId-type-role-name

使用此索引,我可以轻松过滤 ten t r n 但如果我只需要过滤 tenantId type name 我应该如何查询 GSI 以获取所有信息租户ten类型t,名称包含n但对role没有限制的记录(contains语句似乎只支持过滤器)。

我想知道是否需要为每个组合创建一个 GSI,例如:

  • tenantId 类型
  • tenantId-角色
  • 租户 ID 名称
  • tenantId 类型角色
  • ...

提前感谢您的帮助

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    在构建 GSI 以简化查询之前。考虑以不同的格式存储您的数据。

    例如,您希望每个租户有多少资源?您可以这样存储您的数据吗:

    {
        tenant: 123, //(partition)
        resources: [ 
          { type: 'type1', role: 'role1', name: 'somename1'},
          { type: 'type2', role: 'role2', name: 'somename2'},
          { type: 'type3', role: 'role3', name: 'somename3'}
        ]
    }
    

    在上述格式中,您的阅读时间将是快速且可扩展的。然后,您可以过滤代码中的包含逻辑。您的 dynamodb 记录的大小可能为 400kb,因此您可能以每条记录的上述格式存储数千个资源。

    另请注意,每个 GSI 都有其自己的读/写单元使用情况,当您插入表中时会用完。如果您使用 GSI 方法并向该表写入大量数据,那么您的写入使用率会高得惊人。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多