DynamoDB:使用过滤表达式与创建具有所选数据的单独表格以提高效率

时间:2016-04-04 23:16:17

标签: amazon-dynamodb

我正在编写一个API,它的数据模型的状态字段为boolean。

对API的调用中有90%需要过滤该状态=“有效”

上下文:

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

现在我的问题是:

  • 数据完整性是一个很大的问题,因为我将更新两个 表格取决于请求。
  • 在此用途中,在Dynamo DB中使用单独的表是一种很好的做法 或者我使用的是错误的DB?
  • 过滤表达式上的查询执行是否足够有效 我可以使用当前的设置吗?

API使用的规模现在是中等的,但预计会增加。

1 个答案:

答案 0 :(得分:1)

过滤器表达式效率低下,因为在处理扫描或查询后,过滤器表达式将应用于结果。在某些情况下,它们可以节省网络带宽,但除此之外,您也可以在自己的代码中应用过滤器,结果和效率几乎相同。

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

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

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

如果您希望许多记录处于活动状态且只有少数处于非活动状态,那么使用过滤器实际上可能是最佳选择,但请记住,过滤后的记录仍会计入您的预配置吞吐量,因此您只需过滤他们在应用程序中的结果大致相同。

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