【问题标题】:Complex filtering queries with multiple attributes具有多个属性的复杂过滤查询
【发布时间】:2021-05-18 00:41:49
【问题描述】:

我有一个页面,其中列出了一些实体并提供了一个具有多个过滤选项的界面。为了简化问题,假设我在该页面上列出了各种电影。因此,对于单个电影条目,去规范化的行应该如下所示;

  • producer_id:分区键 -(例如:PRODUCER#213141)
  • movie_id:排序键 -(例如:MOVIE#887347)
  • producer_name:(例如:“华纳兄弟”)
  • movie_name:(例如:“哈利波特”)
  • status:(例如:“ON_SHOW”)
  • publish_date:(例如:“2020.01.01”)
  • type:(例如:“幻想”)
  • language:(例如:“英语”)

我想通过使用用作 GSI 辅助键的复合属性来启用过滤。我的复合属性看起来像这样;

  • GS1SK: "harry_potter#2020.01.01#fantasy#English#ON_SHOW"

这个二级索引的分区键就是producer_id

假设任何用户访问该页面并希望使用给定的过滤选项过滤掉电影。这样的访问模式示例是;

获取华纳兄弟制作的所有科幻电影,并拥有 状态ON_SHOW

但是,问题从这里开始。由于组合属性不是分层的,因此复合属性不能用于此场景。因为在上面的访问模式示例中,用户可以选择不指定任何日期,只是想获得任何日期范围的结果。但是当你查看复合属性的结构时,不可能不指定日期范围以预先过滤其他属性,例如电影类型或电影语言。

我知道 DynamoDB 不适合这种复杂的查询,但是,我认为在列表页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。

  1. 也许我在复合属性背后的想法有误?
  2. 我是否应该使用过滤表达式,而没有办法使用复合 GSI 进行这种高级过滤?
  3. 也许对于这种情况,我应该考虑 Elastic Search 或 AWS Athena 服务?
  4. 我需要在我的应用程序的其他页面中提供更多过滤选项,例如过滤列出的用户及其人口统计信息。您认为我应该考虑迁移 RDBS 而不是使用 NO-SQL 数据库吗?

我真正想做的是在没有任何过滤表达式的情况下提供这些过滤功能,以减少 RCU 的使用,并提高我的查询效率。我将不胜感激任何帮助和建议。谢谢。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb


    【解决方案1】:

    听起来您对复合属性非常了解,并且对您的选择有充分的把握。您偶然发现了 DynamoDB 的弱点之一。使用 DynamoDB 支持这种即席搜索功能具有挑战性。

    我已经看到使用 Elastic Search(您的选项 #3)之类的工具解决了这个问题。一种常见的模式是启用 DynamoDB 流,它可用于更新 Elastic Search 索引。需要设置更多的基础架构,但搜索功能将比单独使用 DynamoDB 获得的灵活得多。

    【讨论】:

      猜你喜欢
      • 2022-11-05
      • 2016-04-12
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-20
      相关资源
      最近更新 更多