【发布时间】: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