如何在 DynamoDB 中管理一对多映射

use*_*195 1 nosql amazon-dynamodb

我需要在 AWS DynamoDB 中维护一对多关系数据。例如,一名员工可以拥有多种技能映射到他身上。在典型的 RDBMS 中,我将创建一个SKILL_MASTER表,其中SkillIdSkillName作为列和EMPLOYEE表。然后,我会在地图SkillId雇员EMPLOYEE表。DynamoDB 中的正确方法是什么?

注意:我对 NoSQL 完全陌生,因此是这个基本问题。

Yu *_*ang 6

首先,您应该查看 DynamoDB 的邻接列表设计模式 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html

如果你只想有一个一对多的关系,你可以像这样设计表格。

这里的排序键表示记录的类型。
如果记录是员工,则 SK 以前缀“员工-”及其 ID 开头。
如果记录是skill,SK可以是'skill-'加上它的id,或者如果你不想为它创建id,你可以简单地使用'skill'字符串。

base table
+------------+------------+-------------+
|PK          |SK          |Attributes   |
|------------|------------|-------------|
|employee-id |employee-id |name         |
|employee-id |skill-id    |name         |
+------------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)

此外,如果您想搜索具有特定技能的所有员工,您应该创建其他 GSI 表。将技能的名称设置为 GSI 的分区键,并在您的基表的分区键和排序键上进行投影

+------------+------------+
|GSI-PK      |Projection  |
|------------|------------|
|name        |PK, SK      |
+------------+------------+
Run Code Online (Sandbox Code Playgroud)

然后你可以通过使用来查询一个员工的所有技能 SELECT * FROM base_table WHERE PK=employee-123 AND SK.startsWith('skill-')
如果你想通过技能id获取员工的id,你可以使用SELECT * FROM GSI_table WHERE name='HTML'

另外,如果你真的想让所有拥有相同技能的员工,最好是多对多的关系。为此,您可以参考我关于 DynamoDB 中多对多的其他答案:How to handle many to many in DynamoDB

注意:我写的 SQL 只是伪代码,仅供您参考。