我需要在AWS DynamoDB中维护一对多的关系数据。例如一名员工可以将多种技能映射到他。在典型的RDBMS中,我将创建 SKILL_MASTER 表,其中 SkillId , SkillName 作为列和 EMPLOYEE 表。然后,我将 SkillId 映射到 EMPLOYEE 表中的 EmployeeId 。 DynamoDB中的正确方法是什么?
注意:我是NoSQL的新手,因此这个基本问题。
答案 0 :(得分:4)
Dynamodb db不支持RDBMS之类的关系,如果你想要像RDBMS stlye这样的引用,那么你必须根据员工的技能ID多次查询。
让我们举一个在NoSQL中实现RDBMS方法的例子 (不推荐) ,< / em>的
记录技能表列表
{ "skillId": 1, "name": "HTML" },
{ "skillId": 2, "name": "CSS" },
{ "skillId": 3, "name": "JS" }
Employee表中包含skillId
的记录列表 { "employeeId ": 1, "name": "ONE", "skillId": [1,2,3] }
如果您的应用程序经常检索员工数据,您还需要查询按技能ID获取技能详细信息。它增加了开发的复杂性,也没有推荐。
推荐方法
最佳方法是将技能信息作为员工数据中的列表。
具有技能列表的员工记录
{
"employeeId": 1,
"name": "ONE",
"skill": [ //Adding skills as a list
{
"skillId": 1,
"name": "HTML"
},
{
"skillId": 2,
"name": "CSS"
}
]
}
通过在Employee表中添加技能,您可以使用单个查询中的技能列表检索员工详细信息。
答案 1 :(得分:3)
首先,您应该了解DynamoDB的邻接列表设计模式 https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html
如果只想建立一对多关系,则可以像这样设计表。
此处的排序键指示记录的类型。
如果记录是雇员,则SK以前缀'employee-'及其ID开头。
如果记录是技能,则SK可以是带有其ID的“ skill-”,或者如果您不想为其创建ID,则只需使用“ skill”字符串即可。
base table
+------------+------------+-------------+
|PK |SK |Attributes |
|------------|------------|-------------|
|employee-id |employee-id |name |
|employee-id |skill-id |name |
+------------+------------+-------------+
如果您还想搜索所有具有特定技能的员工,则应创建其他GSI表。将技能名称设置为GSI的分区键,并在基表的分区键和排序键上进行投影
+------------+------------+
|GSI-PK |Projection |
|------------|------------|
|name |PK, SK |
+------------+------------+
然后,您可以使用来查询一位员工的所有技能
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只是伪代码,仅供您参考。