nosql - 如何在不使用扫描的情况下在 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,它需要一些维护。
任何想法我将如何做到这一点?
解决方案
在这种情况下,您可以将 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 的数据。
推荐阅读
- java - 当我在片段中回按时按钮不可见
- common-lisp - Common Lisp 中的 cell 和 cons cell 是否相同?以及如何访问单元格的内容?
- python - cx_freeze 部署:sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:mssql.pyodbc
- c++ - TBB流图中如何实现流水线并行
- r - 对于 R 包 MCMCglmm 贝叶斯回归中的先验定义,如何通过参数 nu 传达不同的相信强度?
- android - 如何使用改造多次调用具有不同数据的相同 API?
- java - 我怎样才能找到 id 元素的文本,使用 Java 的 css
- javascript - 细长的路由链接删除了电子中的基本路径
- python - 模块pafy(Python)的问题
- python - 使用 IPython.display.audio 在 jupyter notebook 中播放音频在函数内使用时不起作用