【发布时间】: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 不适合这种复杂的查询,但是,我认为在列表页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。
- 也许我在复合属性背后的想法有误?
- 我是否应该使用过滤表达式,而没有办法使用复合 GSI 进行这种高级过滤?
- 也许对于这种情况,我应该考虑 Elastic Search 或 AWS Athena 服务?
- 我需要在我的应用程序的其他页面中提供更多过滤选项,例如过滤列出的用户及其人口统计信息。您认为我应该考虑迁移 RDBS 而不是使用 NO-SQL 数据库吗?
我真正想做的是在没有任何过滤表达式的情况下提供这些过滤功能,以减少 RCU 的使用,并提高我的查询效率。我将不胜感激任何帮助和建议。谢谢。
【问题讨论】:
标签: amazon-web-services amazon-dynamodb