use*_*195 1 nosql amazon-dynamodb
我需要在 AWS DynamoDB 中维护一对多关系数据。例如,一名员工可以拥有多种技能映射到他身上。在典型的 RDBMS 中,我将创建一个SKILL_MASTER表,其中SkillId、SkillName作为列和EMPLOYEE表。然后,我会在地图SkillId的雇员在EMPLOYEE表。DynamoDB 中的正确方法是什么?
注意:我对 NoSQL 完全陌生,因此是这个基本问题。
首先,您应该查看 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 只是伪代码,仅供您参考。
| 归档时间: |
|
| 查看次数: |
2119 次 |
| 最近记录: |