【问题标题】:how to migrate relational tables to dynamoDB table如何将关系表迁移到 dynamoDB 表
【发布时间】:2018-11-11 19:28:51
【问题描述】:

我是 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

感谢任何建议

【问题讨论】:

    标签: postgresql amazon-web-services nosql amazon-dynamodb


    【解决方案1】:

    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 的所有班级:Query(partitionKey: studentId, sortkey: STARTS_WITH("Class"));

    3) 获取 A1 班和 2018 年的所有学生:Query(GSI partitionkey: "Class_A1", sortkey: equals(2018))

    对于全局二级索引,分区键和排序键不需要唯一,因此您可以拥有多个 Class_A1, 2018 组合。如果您还没有阅读过Best Practices for DyanmoDB,我强烈建议您阅读全文。

    【讨论】:

    • 嗨,杰克,感谢您的回复。上周末我的笔记本电脑离我很远,我会检查你的建议,很快就会得到结果。
    • 嗨,杰克,很久之后,我尝试了你的建议,但它并没有真正达到我的预期。例如:(3)获取A1班和2018年的学生,它只返回studentId的列表,而不是学生的详细信息。有什么方法可以获取A1班和2018学年的学生信息吗?
    • 是的,您会收到来自 3) 的 studentId 列表,我们在 dynamo 中没有连接。那时,您对这些 id 的处理取决于您的应用程序。或许调用BatchGetItem 来获取返回的id 以立即获取所有详细信息。或者您可以随时使用 GetItem。
    • 或者,如果您想限制对表的读取,您可以将学生的最小详细信息复制到每个班级地图项中,这样步骤 3) 将返回学生详细信息的子集以及 id。这将使读取数据的成本更低,但写入数据的成本更高,因为如果您更改学生详细信息,则必须更新所有重复数据。
    • 值得学习 dynamodb 的工作原理以及定价模型,这里有一个很棒的 stackoverflow 答案:stackoverflow.com/questions/48219867/…
    猜你喜欢
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 2021-07-12
    • 1970-01-01
    相关资源
    最近更新 更多