具有多个属性的复杂过滤查询
Complex filtering queries with multiple attributes
我有一个页面,我在其中列出了一些实体并提供了一个具有多个过滤选项的界面。为了简化问题,假设我在该页面上列出了各种电影。因此,对于单个电影条目,去规范化的行应该如下所示;
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
.
假设任何用户来到该页面并希望使用给定的过滤选项过滤掉电影。这样的访问模式示例是;
Get all of the sci-fi movies produced by Warner Bros and has
the status ON_SHOW.
然而,问题从这里开始。由于组合属性不是分层的,因此复合属性不能用于此场景。因为在上面的访问模式示例中,用户可以选择不指定任何日期,只是想获得任何日期范围内的结果。但是看复合属性的结构,不可能不指定日期范围,提前过滤其他属性,比如电影类型或者电影语言。
我知道 DynamoDB 不是最适合这种复杂查询的,但是,我认为在列表页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。
- 也许我理解错了复合属性背后的想法?
- 我应该使用过滤表达式吗?没有办法使用复合 GSI 进行这种高级过滤吗?
- 也许对于这种情况,我应该考虑使用 Elastic Search 或 AWS Athena 服务?
- 我需要在应用程序的其他页面中提供更多过滤选项,例如使用人口统计信息过滤列出的用户。您认为我应该考虑迁移 RDBS 而不是使用 NO-SQL 数据库吗?
我真正想做的是在不使用任何过滤表达式的情况下提供这些过滤功能,以减少 RCU 的使用,并提高我的查询效率。我将不胜感激任何帮助和建议。谢谢。
听起来您非常了解复合属性并且对您的选项有扎实的把握。您偶然发现了 DynamoDB 的弱点之一。使用 DynamoDB 支持这种临时搜索功能具有挑战性。
我已经看到使用 Elastic Search(您的选项 #3)等工具解决了这个问题。一种常见的模式是启用 DynamoDB 流,它可用于更新 Elastic Search 索引。需要设置更多的基础设施,但搜索功能会比单独使用 DynamoDB 灵活得多。
我有一个页面,我在其中列出了一些实体并提供了一个具有多个过滤选项的界面。为了简化问题,假设我在该页面上列出了各种电影。因此,对于单个电影条目,去规范化的行应该如下所示;
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
.
假设任何用户来到该页面并希望使用给定的过滤选项过滤掉电影。这样的访问模式示例是;
Get all of the sci-fi movies produced by Warner Bros and has the status ON_SHOW.
然而,问题从这里开始。由于组合属性不是分层的,因此复合属性不能用于此场景。因为在上面的访问模式示例中,用户可以选择不指定任何日期,只是想获得任何日期范围内的结果。但是看复合属性的结构,不可能不指定日期范围,提前过滤其他属性,比如电影类型或者电影语言。
我知道 DynamoDB 不是最适合这种复杂查询的,但是,我认为在列表页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。
- 也许我理解错了复合属性背后的想法?
- 我应该使用过滤表达式吗?没有办法使用复合 GSI 进行这种高级过滤吗?
- 也许对于这种情况,我应该考虑使用 Elastic Search 或 AWS Athena 服务?
- 我需要在应用程序的其他页面中提供更多过滤选项,例如使用人口统计信息过滤列出的用户。您认为我应该考虑迁移 RDBS 而不是使用 NO-SQL 数据库吗?
我真正想做的是在不使用任何过滤表达式的情况下提供这些过滤功能,以减少 RCU 的使用,并提高我的查询效率。我将不胜感激任何帮助和建议。谢谢。
听起来您非常了解复合属性并且对您的选项有扎实的把握。您偶然发现了 DynamoDB 的弱点之一。使用 DynamoDB 支持这种临时搜索功能具有挑战性。
我已经看到使用 Elastic Search(您的选项 #3)等工具解决了这个问题。一种常见的模式是启用 DynamoDB 流,它可用于更新 Elastic Search 索引。需要设置更多的基础设施,但搜索功能会比单独使用 DynamoDB 灵活得多。