首页 > 解决方案 > 如何在不使用扫描的情况下在 DynamoDB 中查询 n:n 邻接列表映射

问题描述

我正在尝试在 DynamodDB 中建模一个编目系统。它有“目录”,其中包含“集合”。每个“集合”可以被许多“标签”标记。

在 RDBMS 中,我将创建一个与“Collections”具有 1:n 关系的表“Catalogs”。“Collections”会有一个 n:n 和“Tags”,因为一个 Collection 可以有多个 Tags,一个 Tag 可以属于多个 Collection。

我要运行的查询是:

1) 获取所有目录

2)通过ID获取目录

3) 通过目录 ID 获取收藏

我在 AWS 上阅读我可以使用邻接列表映射设计(因为我有带有“标签”的 n:n)。所以这是我的表结构:

PK         SK         name    
cat-1      cat-1      Sales Catalog
cat-1      col-1      Sales First Collection
cat-1      col-2      Sales Second Collection
cat-2      cat-2      Finance Catalog 
tag-1      tag-1      Recently Added Tag
col-1      tag-1      (collection, tag relationship)

这里的问题是我必须使用我认为效率低下的扫描才能获取所有“目录”,因为查询的 PK 必须是“=”而不是“开始于”。

我唯一能想到的是创建另一个属性,如“GSI_PK”,并在 PK 为 cat-1 且 SK 为 cat-1 时添加“Catalog_1”,当 PK 为 cat-2 且 SK 为 cat-时添加“Catalog_2” 2. 我从来没有真正看到这样做过,所以我不确定这是否可行,如果我想更改 ID,它需要一些维护。

任何想法我将如何做到这一点?

标签: nosqlamazon-dynamodbaws-appsync

解决方案


在这种情况下,您可以将 PK 设置为对象的类型,将 SK 设置为 uuid。记录看起来像这样{ PK: "Catalog", SK: "uuid", ...other catalog fields }。然后,您可以通过查询 PK = Catalog 来获取所有目录。

要存储关联,您可以在两个字段上使用 GSI,sourcePK并且relatedPK可以在其中存储关联事物的记录。要关联一个对象,您将创建一个记录,例如{ PK: "Association", SK: "uuid", sourcePK: "category-1", relatedPK: "collection-1", ... other data on the association }。要查找与 ID 为 1 的“目录”关联的对象,您需要在 GSI 上查询 sourcePK = catalog-1。

使用此设置,您需要注意热键,并应确保在表或索引中的同一分区键下永远不会有超过 10GB 的数据。


推荐阅读