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

Nosql 如何在DynamoDB中管理一对多映射,nosql,amazon-dynamodb,Nosql,Amazon Dynamodb,我需要在AWS DynamoDB中维护一对多关系数据。e、 g.一名员工可以拥有多个对应的技能。在典型的RDBMS中,我将创建一个SkillId、SkillName作为列的skillu主表和一个EMPLOYEE表。然后,我将把SkillId映射到EMPLOYEE表中的EmployeeId。在DynamoDB中,什么是正确的方法 注意:我对NoSQL是完全陌生的,因此我提出了这个基本问题。Dynamodb db不支持像RDBMS这样的关系,如果您想要像RDBMS stlye这样的引用,那么您必须根

我需要在AWS DynamoDB中维护一对多关系数据。e、 g.一名员工可以拥有多个对应的技能。在典型的RDBMS中,我将创建一个SkillId、SkillName作为列的skillu主表和一个EMPLOYEE表。然后,我将把SkillId映射到EMPLOYEE表中的EmployeeId。在DynamoDB中,什么是正确的方法


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

Dynamodb db不支持像RDBMS这样的关系,如果您想要像RDBMS stlye这样的引用,那么您必须根据员工的技能id多次查询

让我们举一个在NoSQL中实现RDBMS方法的例子,不推荐使用

记录一览表

使用skillId的Employee表中的记录列表

如果您的应用程序经常检索员工数据,那么您还可以通过查询按技能id获取技能详细信息。这会增加开发的复杂性,也不推荐这样做

建议的方法

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

员工记录和技能列表


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

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

让我们举一个在NoSQL中实现RDBMS方法的例子,不推荐使用

记录一览表

使用skillId的Employee表中的记录列表

如果您的应用程序经常检索员工数据,那么您还可以通过查询按技能id获取技能详细信息。这会增加开发的复杂性,也不推荐这样做

建议的方法

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

员工记录和技能列表


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

首先,您应该了解DynamoDB的邻接列表设计模式

如果您只想拥有一对多的关系,您可以这样设计表

此处的排序键指示记录的类型。 如果记录是employee,则SK以前缀'employee-'及其id开头。 如果记录是skill,则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      |
+------------+------------+
然后您可以使用 从基本表格中选择*,其中PK=employee-123,SK.startsWith'skill-' 如果您想通过技能id获取员工id,可以使用SELECT*FROM GSI_table,其中name='HTML'

此外,如果你真的想让所有员工都拥有相同的技能,最好是建立多对多的关系。关于这一点,您可以参考我关于DynamoDB中多对多的另一个答案:


注意:我编写的SQL只是伪代码,只是为了给您一个想法。

首先,您应该看看DynamoDB的邻接列表设计模式

如果您只想拥有一对多的关系,您可以这样设计表

此处的排序键指示记录的类型。 如果记录是employee,则SK以前缀'employee-'及其id开头。 如果记录是skill,则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      |
+------------+------------+
然后您可以使用 从基本表格中选择*,其中PK=employee-123,SK.startsWith'skill-' 如果您想通过技能id获取员工id,可以使用SELECT*FROM GSI_table,其中name='HTML'

此外,如果你真的想让所有员工都拥有相同的技能,最好是建立多对多的关系。关于这一点,您可以参考我关于DynamoDB中多对多的另一个答案:


注意:我编写的SQL只是伪代码,只是为了给您一个想法。

谢谢您的回复。但在推荐的方法中,我如何搜索所有具有特定技能的员工,比如说HTML。我的理解是,我们只能用主键搜索。谢谢您的回复。但在推荐的方法中,我如何搜索所有具有特定技能的员工,比如说HTML。我的理解是我们只能用主键搜索。很好的答案。。!!回答得很好。。!!
+------------+------------+
|GSI-PK      |Projection  |
|------------|------------|
|name        |PK, SK      |
+------------+------------+