具有多个标签的 DynamoDB 查询
Posted
技术标签:
【中文标题】具有多个标签的 DynamoDB 查询【英文标题】:DynamoDB Query with multiple tags 【发布时间】:2017-07-29 02:11:36 【问题描述】:我对 DynamoDB 比较陌生,目前我们正在考虑使用 DynamoDB 将现有项目迁移到无服务器应用程序,我们希望在其中调整来自 RDMS 数据库的以下设置:
表格:
项目(ProjectID) 文件(FileID、ProjectID、文件名) 标签(FileID、标签)我们希望使用 DynamoDB 进行查询,以获取具有一个或多个 Tags 的特定 Project(按 ProjectID)的所有 Files(通过标签)。在 RDMS 中,此查询很简单,例如:
SELECT * FROM Files JOIN Tags ON Tags.FileID = Files.FileID WHERE Files.ProjectID = ?PROJECT AND Tags.Tag = ?TAG_1 OR ?TAG_2 ...
目前,我们有以下 DynamoDB 设置(但仍可以更改):
项目(ProjectID [HashKey],...) 文件(ProjectID [HashKey]、FileID [RangeKey]、...)还请考虑项目条目的数量很大(在 1000 到 30000 之间)以及每个项目的文件数量(在 50 到 100.000 之间),并且查询应该非常快。
如何使用 DynamoDB 查询来实现这一点,最好不使用过滤器表达式,因为它们是在数据选择之后应用的?如果表 Files 可以有一个 StringSet Tags 作为列,那将是完美的,但我想这不能用于高效的 DynamoDB 查询(因此不使用 DynamoDB-scan),因为 DynamoDB-indices 只能是 String、Binary 和 Number 类型,而不是 StringSet 类型?这可能是Global Secondary Index (GSI) 的适用用例吗?
【问题讨论】:
【参考方案1】:有点晚了,刚看到这个问题是从另一个人那里引用的。
我猜你已经解决了这样的问题?
DynamoDB 表
项目(ProjectID [HashKey],...) 文件(ProjectID [HashKey]、FileID [RangeKey]、...) 标签(标签 [HashKey]、FileID [RangeKey]、ProjectID [LSI 排序键])在 FileTags 上,您需要 FileID 来使主键唯一,但您可以将 ProjectID 添加为本地二级索引的排序键,这样您就可以在 Tag + ProjectID 上进行搜索。
这是某种数据非规范化,但这就是使用 NoSQL 所需要的 :-( 。例如,如果您的文件将切换到另一个项目,您不仅需要更新文件上的 ProjectID,还需要更新所有标签。
【讨论】:
【参考方案2】:这个问题已经***年了,但它仍在 Google 搜索结果中。因此,如果其他人来到这里,也许 DynamoDB 文档中的以下页面可以提供帮助。只是自己找到了它,还没有尝试过,但它看起来很有希望。似乎比这里的其他回复更新,并显示了解决问题的好方法。
https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html
【讨论】:
以上是关于具有多个标签的 DynamoDB 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何进行地理距离查询仅返回我尚未“喜欢”的结果、Elastic Search、Dynamo DB