【问题标题】:Multiple optional query parameter in DynamoDBDynamoDB 中的多个可选查询参数
【发布时间】:2021-05-29 20:12:32
【问题描述】:

我正在尝试从 SQL Server 迁移到 DynamoDB,但在处理具有多个可选 where 参数的查询时遇到了问题。

我的 SaaS 应用程序有大约 30 个客户。每个客户在订单表中都有大约 2 万个订单,并且还在不断增长。

在网络应用程序中,我的客户可以非常精细地过滤订单。这通过 T-SQL 基于服务器(基于 DB)发生。

在 SQL 中,我当前的解决方案如下所示:

WHERE 1=1
  AND order.IsDeleted IS NULL
    AND order.ObjectId IN (SELECT ObjectId FROM @allowedObjects)
    AND (@editorId IS NULL OR order.EditorId = @editorId)
    AND (@dealerId IS NULL OR order.DealerId = @dealerId)
    AND (@orderTypeId IS NULL OR order.OrderTypeId = @orderTypeId)
    AND (@objectId IS NULL OR order.ObjectId = @objectId)       
    AND (@read IS NULL OR (@read = 1 AND order.ReadOn IS NOT NULL) OR (@ready = 2 AND order.ReadOn IS NULL))
    AND (@query IS NULL OR (order.Reference LIKE @query OR order.ObjectJson LIKE @query OR order.ObjectDetailsJSON LIKE @query OR order.Title LIKE @query OR CONVERT(nvarchar, activity.ActivityId) LIKE @query))
    AND (@dueDateFrom IS NULL OR CAST(order.DueDate AS DATE) >= CAST(@duaeDateFrom AS DATE))
    AND (@dueDateTo IS NULL OR CAST(order.DueDate AS DATE) <= CAST(@dueDateTo AS DATE))
    AND (@createdOnFrom IS NULL OR CAST(order.CreatedOn AS DATE) >= CAST(@createdOn AS DATE))
    AND (@createdOnTo IS NULL OR CAST(order.CreatedOn AS DATE) <= CAST(@createdOnTo AS DATE))

客户可以通过多个可选参数过滤特定订单。因此,您可以使用特定用户创建并分配给特定经销商的特定订单类型查询两个不同创建和到期日期范围之间的订单。 有时他们只想要特定经销商的特定类型的所有未结订单。

我在 DynamoDB 中的 PK 就像客户#83F8B46E-5FD9-4E04-AEB5-73F1AF7182F2

我知道我应该避免在 DynamoDB 中进行属性过滤,因为返回记录的数量(您支付的费用)仅取决于 PK 和 SK。

在 DynamoDB 中,我的第一个方法是“重载”(我不知道这是否是在 PK/SK 中连接字段的正确词)像 created_2020_05_05#editor_1234#object_66 这样的 SK。但这只能让我过滤

  • 特定编辑者的所有订单,与对象无关
  • 特定编辑器针对特定对象(也不包括该对象)的所有订单
  • 以上组合在一个创建日期范围内

我可以创建具有不同“重载”SK 的 GSI,并且可以将 thise 用于键和排序键条件。

你知道我的场景的任何提示/策略吗?

提前致谢,BR!

【问题讨论】:

    标签: amazon-dynamodb dynamodb-queries


    【解决方案1】:

    DynamoDB 并没有真正针对这些访问模式进行优化,所以我会这样做:

    1. 找出过滤器中使用最广泛的 2-3 个属性
    2. 为这些属性中的每一个创建一个 GSI 并进行一些分析,其中哪些过滤器会减少检索到的项目的数量最多,即哪些会导致使用的 RCU 最少

    当您收到客户的请求时,您:

    1. 检查您拥有 GSI 的最常见过滤条件是否存在
    2. 如果是这种情况,请选择最能减少结果数量的过滤条件(见上文)。转至 4。)
    3. 如果最常用的过滤条件都不是查询的一部分,您将不得不选择该客户的所有订单(最坏情况)
    4. 针对 3) 中的 GSI 或 4) 中的主索引执行 Query
    5. 在客户端过滤剩余数据或在 DynamoDB 中使用 FilterExpression 以减少正在使用的网络带宽。后者不会帮助您处理正在消耗的 RCU,但会在读取后进行过滤。
    6. 返回过滤结果

    这里的权衡是在存储空间 + 用于 GSI 的 RCU/WCU 和查询速度之间。

    【讨论】:

      猜你喜欢
      • 2018-06-16
      • 2010-09-24
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2023-02-16
      相关资源
      最近更新 更多