【问题标题】:How to manage one-many mapping in DynamoDB如何在 DynamoDB 中管理一对多映射
【发布时间】:2018-07-24 01:35:24
【问题描述】:

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

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

【问题讨论】:

    标签: nosql amazon-dynamodb


    【解决方案1】:

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

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

    这里的排序键,表示记录的类型。
    如果记录是雇员,则 SK 以前缀 'employee-' 及其 id 开头。
    如果记录是skill,SK可以是'skill-'和它的id,或者如果你不想为它创建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只是伪代码,仅供参考。

    【讨论】:

    • 优秀的答案..!!
    【解决方案2】:

    Dynamodb db 不支持 RDBMS 之类的关系,如果您想要 RDBMS stlye 之类的引用,则必须根据员工的技能 ID 多次查询。

    让我们举个例子,在 NoSQL 中实现 RDBMS 方法(不推荐)

    记录技能表列表

     { "skillId": 1, "name": "HTML" },
     { "skillId": 2, "name": "CSS" },
     { "skillId": 3, "name": "JS" }
    

    Employee 表中具有 SkillId 的记录列表

     { "employeeId ": 1, "name": "ONE", "skillId": [1,2,3] }
    

    如果您的应用程序经常检索 Employee 数据,您可以另外查询以通过技能 ID 获取技能详细信息。它增加了开发的复杂性,也不推荐使用。

    推荐方法

    最佳方法是将技能信息作为列表包含在员工数据中。

    带有技能列表的员工记录

    {
        "employeeId": 1,
        "name": "ONE",
        "skill": [  //Adding skills as a list
            {
                "skillId": 1,
                "name": "HTML"
            },
            {
                "skillId": 2,
                "name": "CSS"
            }
        ]
    }
    

    通过在 Employee 表中添加技能,您可以在单个查询中使用技能列表检索 Employee 详细信息。

    【讨论】:

    • 感谢您的回复。但在推荐方法的情况下,我如何搜索所有具有特定技能的员工,比如 HTML。我的理解是我们只能用主键搜索。
    猜你喜欢
    • 2016-06-17
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-19
    • 2015-08-02
    相关资源
    最近更新 更多