Amazon dynamodb DynamoDB中的多个可选查询参数

Amazon dynamodb DynamoDB中的多个可选查询参数,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我正试图从SQL Server迁移到DynamoDB,但对于具有多个可选where参数的查询,我遇到了问题 我的SaaS应用程序有大约30个客户。每个客户在订单表中约有2万份订单,而且订单数量还在不断增长 在web应用程序中,我的客户可以非常精细地过滤订单。这是通过T-SQL实现的基于服务器的DB 在SQL中,我当前的解决方案如下所示: WHERE 1=1 AND order.IsDeleted IS NULL AND order.ObjectId IN (SELECT Object

我正试图从SQL Server迁移到DynamoDB,但对于具有多个可选where参数的查询,我遇到了问题

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

在web应用程序中,我的客户可以非常精细地过滤订单。这是通过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))
客户可以通过多重可选参数筛选特定订单。因此,您可以使用特定用户创建并分配给特定经销商的特定订单类型,在两个不同的创建日期和到期日期范围之间查询下订单。 有时,他们只是想要特定经销商的特定类型的所有未结订单

我在发电机中的主键与客户83F8B46E-5FD9-4E04-AEB5-73F1AF7182F2类似

我知道我应该避免在DynamoDB中进行属性过滤,因为返回记录的数量取决于PKs和SKs

在DynamoDB中,我的第一个方法是重载,我不知道这是否是连接PK/SK中的字段的正确词,类似于创建的SK\u 2020\u 05\u 05editor\u 1234object\u 66。但这只允许我过滤

由特定编辑器生成的所有命令,而不考虑对象 特定编辑器对特定对象的所有命令也不包括该对象 以上内容在创建日期范围内合并 我可以用不同的重载SKs创建GSI,并可以将其用于键和排序键条件

你知道我的场景有什么提示/策略吗


提前感谢,BR

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

找出过滤器中使用最广泛的2-3个属性 为这些属性中的每一个创建一个GSI,并进行一些分析,这些过滤器中哪一个减少检索到的项目数量最多,即,哪一个将导致使用的RCU最少 当您收到客户的请求时,您:

检查GSIs最常见的过滤条件是否存在 如果是这种情况,请选择过滤条件,以最大程度地减少上述结果量。去4号。 如果查询中没有最常用的筛选条件,则必须选择该客户最坏情况下的所有订单 对3中的GSI或4中的主索引执行查询。 在客户端过滤剩余的数据,或者在DynamoDB中使用FilterExpression来减少正在使用的网络带宽。后者不会帮助您使用RCU,但是,在读取后会进行过滤。 返回过滤后的结果 这里的折衷是用于GSIs的存储空间+RCU/WCU和查询速度