我有一个页面,我列出了一些实体,并提供了多个过滤选项的接口。为了简化问题,假设我列出了该页面上的各种电影。因此,对于单个电影条目,非规范化行应该像这样;
producer_id
:分区密钥-(例如:PRODUCER#213141)movie_id
: Sort Key -(例如:MOVIE#887347)producer_name
:(例如:"Warner ")movie_name
:(如:"哈利Potter"status
:(例如:"ON_SHOW")publish_date
:(e.g.: "2020.01.01">type
:(例如:"fantasy")language
:旅客:"English"
我想通过使用用作GSI辅助键的组合属性来启用过滤。我的复合属性看起来像这样;
GS1SK
: "哈利波特#2020.01.01#奇幻#英语#ON_SHOW">
这个二级索引的分区键就是producer_id
。
假设任何用户来到这个页面,想要用给定的过滤选项过滤掉电影。这样的访问模式示例是;
获取所有科幻华纳兄弟出品的电影并已ON_SHOW.
然而,问题从这里开始。由于组合属性不是层次化的,因此组合属性不能用于此场景。因为在上面的访问模式示例中,用户可以选择不指定任何日期,只是希望获得任何日期范围的结果。但是,当您查看复合属性的结构时,不提前为筛选其他属性(如电影类型或电影语言)指定日期范围是不可能的。
我知道DynamoDB不是最适合这种复杂的查询,但是,我认为在清单页面中提供过滤选项是一个非常典型的场景,即使是最简单的产品也应该提供。我的问题是,我应该使用什么样的方法来满足这种过滤需求。
- 也许我得到复合属性背后的想法是错误的?
- 我应该使用过滤表达式,没有办法做这样的高级过滤与复合gsi ? 也许在这种情况下,我应该考虑弹性搜索或AWS雅典娜服务?
- 我需要在我的应用程序的其他页面中提供更多的过滤选项,例如过滤列出的用户及其人口统计信息。你认为我应该考虑迁移rbs而不是使用NO-SQL数据库吗?
我真正想做的是在没有任何过滤表达式的情况下提供这些过滤功能,以减少RCU的使用,并提高查询的效率。我将感激任何帮助和建议。谢谢。
听起来您对复合属性非常了解,并且对选项有很好的把握。您无意中发现了DynamoDB的一个弱点。使用DynamoDB来支持这种特殊的搜索功能是很有挑战性的。
我见过使用弹性搜索(你的选项#3)之类的工具解决这个问题。一种常见的模式是启用DynamoDB流,它可用于更新Elastic Search索引。需要设置更多的基础设施,但是搜索功能比单独使用DynamoDB要灵活得多。