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

时间:2018-01-31 08:41:41

标签: nosql amazon-dynamodb

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

注意:我是NoSQL的新手,因此这个基本问题。

2 个答案:

答案 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只是伪代码,仅供您参考。