Amazon dynamodb DynamoDB:使用过滤表达式与使用选定数据创建单独的表相比,提高了效率

Amazon dynamodb DynamoDB:使用过滤表达式与使用选定数据创建单独的表相比,提高了效率,amazon-dynamodb,Amazon Dynamodb,我正在编写一个API,它有一个带有布尔状态字段的数据模型 90%的API调用将需要过滤该状态=“活动” 背景: 目前,我将其作为DyanmoDB布尔字段,并在其上使用过滤表达式,但我反对创建一个带有相关标识符的单独表,该标识符充当查询的哈希键,并保存对应于“活动”状态的相应项信息,因为只有一个项具有“活动”状态“特定哈希键在项中的状态 现在我的问题是: 数据完整性在这里是一个大问题,因为我将更新两个 表取决于请求 在使用Dynamo DB时,使用单独的表是一种良好的做法吗 案例或我使用了错误的

我正在编写一个API,它有一个带有布尔状态字段的数据模型

90%的API调用将需要过滤该状态=“活动”

背景:

目前,我将其作为DyanmoDB布尔字段,并在其上使用过滤表达式,但我反对创建一个带有相关标识符的单独表,该标识符充当查询的哈希键,并保存对应于“活动”状态的相应项信息,因为只有一个项具有“活动”状态“特定哈希键在项中的状态

现在我的问题是:

  • 数据完整性在这里是一个大问题,因为我将更新两个 表取决于请求
  • 在使用Dynamo DB时,使用单独的表是一种良好的做法吗 案例或我使用了错误的数据库
  • 过滤表达式上的查询执行是否足够高效 我可以使用当前的设置吗

API的使用规模目前处于中等水平,但预计会增加。

过滤器表达式将是低效的,因为过滤器表达式在扫描或查询处理后应用于结果。在某些情况下,它们可以节省网络带宽,但在其他情况下,您也可以在自己的代码中使用预过滤tty的结果和效率基本相同

另一种选择是在布尔字段上创建一个带有分区键的全局二级索引(GSI),如果“活动”记录明显少于“非活动”记录,这可能会更好。在这种情况下,一种有用的模式是创建一个代理字段,例如“状态\活动”,仅对活动字段设置为TRUE,对其他字段设置为NULL。然后,如果在“status_active”字段上使用分区键创建GSI,则它将仅包含活动记录(NULL值不会被索引)

代理项字段上的索引可能是最好的选择,只要您预期表中的活动记录集是稀疏的(即,活动的比不活动的少)

如果您希望大约50%的记录处于活动状态,50%处于非活动状态,那么拥有两个表并自己处理事务完整性可能是一个更好的选择。如果很少期望记录在状态之间转换,这一点尤其有吸引力。DynamoDB提供了非常强大的原子计数器和条件al检查您可以用来制定解决方案,确保状态转换一致

如果您希望许多记录处于活动状态,而只有少数记录处于非活动状态,那么使用筛选器实际上可能是最好的选择,但请记住,经过筛选的记录仍然会计入您的供应吞吐量,因此,您可以在应用程序中简单地筛选出这些记录,并获得大致相同的结果


总之,答案取决于status属性中值的分布。

谢谢。这非常有用。但我对“status\u active”上带有分区键的**GSI有疑问字段**。我在表中有稀疏的活动记录,但我需要首先对Id进行哈希运算,然后找到活动记录。因此,将status_active作为分区键是无效的。很抱歉,问题没有明确提到这一点。@user506591您能解释一下您的表的哈希/范围键是什么吗?我感觉可能有误对于GSI的工作,但我不能保证它的ID是哈希/分区密钥,它是作为投影的信息。投影也包含StasuShActive字段。为了得到活动的项目,我得到了带有ID的项,并在StasuxActive=trut上加上了过滤器。您应该创建一个GSI,并使用StasuScActive作为PAR。GSI的tition键。需要注意的几点:1)代理状态\活动属性的用途是仅当状态为活动时才非空,因此您永远不会有状态\活动=假的记录2)分区键对于GSI不必是唯一的-这与表的要求不同