我是DynamoDB的新手,在我当前的项目中,我正在尝试将大多数关系表迁移到Dynamo DB。我正面临一个棘手的场景,我不知道如何解决
在Posgresql中,有2个表:
Student
id | name | age | address | phone
---+--------+-----+---------+--------
1 | Alex | 18 | aaaaaa | 88888
2 | Tome | 19 | bbbbbb | 99999
3 | Mary | 18 | ccccc | 00000
4 | Peter | 20 | dddddd | 00000
Registration
id | class | student | year
---+--------+---------+---------
1 | A1 | 1 | 2018
2 | A1 | 3 | 2018
3 | A1 | 4 | 2017
4 | B1 | 2 | 2018
我的查询:
select s.id, s.name, s.age, s.address, s.phone
from Registration r inner join Student s on r.student = s.id
where r.class = 'A1' and r.year = '2018'
结果:
id | name | age | address | phone
---+--------+-----+---------+--------
1 | Alex | 18 | aaaaaa | 88888
3 | Mary | 18 | ccccc | 00000
那么,我如何设计dynamoDB表来实现这个结果呢?扩展为CRUD
感谢任何建议
答案 0 :(得分:0)
DynamoDB表设计将在很大程度上取决于您的访问模式。如果不知道应用程序所需的完整要求和查询,就无法写出正确的答案。但鉴于您的示例,这里的表设计可能有效:
| (GSI PK) |
(P. Key) | (Sort) | (GSI Sort)
studentId | itemType | name | age | address | phone | year
----------+----------+--------+-----+---------+-------+------
1 | Details | Alex | 18 | aaaaaa | 88888 |
1 | Class_A1 | | | | | 2018
2 | Details | Tome | 19 | bbbbbb | 99999 |
2 | Class_B1 | | | | | 2018
3 | Details | Mary | 18 | ccccc | 00000 |
3 | Class_A1 | | | | | 2018
4 | Details | Peter | 20 | dddddd | 00000 |
4 | Class_A1 | | | | | 2017
请注意全局二级索引,其中包含项类型上的分区键和年份上的排序键。 通过这种设计,我们有一些查询选项:
1)获取给定id的学生:GetItem(partitionKey:studentId,sortkey:Details)
2)获取给定学生ID的所有课程:查询(partitionKey:studentId,sortkey:STARTS_WITH(" Class"));
3)让所有学生进入A1班和2018年:查询(GSI分区密钥:" Class_A1",sortkey:equals(2018))
对于全局二级索引,分区和排序键不需要是唯一的,因此您可以拥有许多Class_A1,2018组合。如果您还没有阅读Best Practices for DyanmoDB,我强烈建议您完整阅读。