与 Dynamodb 的关系 table
Relational table to Dynamodb
我长期使用关系数据库,现在我将使用 DynamoDB。之后,使用关系数据库,我努力在 DynamoDB 中设计我们当前的一些 SQL 表。特别是,决定分区和排序键。我将尝试用一个例子来解释:
当前表:
Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description
我想在 DynamoDB 中合并这些表,并使用 SchoolId 作为分区键,StudentId 作为排序键。但是,我看到一些类似的示例使用 StudentId 作为分区键。
然后我意识到,我们在每个登录功能中使用 "username",因此应用程序会经常使用 "username"(有时使用密码或身份验证令牌)进行查询。这种情况让我思考; SchoolId 作为分区键,用户名作为排序键。
我需要一些关于在这种情况下什么是最佳实践的想法以及一些建议,以便让我更好地理解 NoSQL 和 DynamoDb 概念。
在 NoSql 中,您应该首先尝试列出所有用例,然后尝试对 table 模式建模。
以下是我在您的应用程序中看到的用例
获取具有 userId(密码、年龄、姓名...)的一位用户的用户信息
获取用户 ID 为(class姓名、学校名称)的用户的学校信息
获取一所学校的所有学生。
获取一所学校的 class 的所有学生。
基于这些给定的访问模式,这就是我设计架构的方式
| pk | sk | GSI1 PK | GSI1 SK |
| 12345 | metadata | | | Age:13 | Last name: Singh | Name:Rohan | ...
| 12345 | schoolMeta | SchoolName: DPS | DPS#class5 | className:5 |
使用上述架构,您可以将确定的用例解决为
获取具有userId
的一位用户的用户信息
Select * where pk=userId and sk=metadata
获取userId为
的用户的学校信息
Select * where pk=userId and sk=schoolMeta
获取一所学校的所有学生。
Select * where pk=SchoolId from table=GSI1
将所有学生合而为一class。
Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1
但是给定的模式存在
的缺点
- 如果您想更改学校名称,则必须更新太多行。
我长期使用关系数据库,现在我将使用 DynamoDB。之后,使用关系数据库,我努力在 DynamoDB 中设计我们当前的一些 SQL 表。特别是,决定分区和排序键。我将尝试用一个例子来解释:
当前表:
Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description
我想在 DynamoDB 中合并这些表,并使用 SchoolId 作为分区键,StudentId 作为排序键。但是,我看到一些类似的示例使用 StudentId 作为分区键。
然后我意识到,我们在每个登录功能中使用 "username",因此应用程序会经常使用 "username"(有时使用密码或身份验证令牌)进行查询。这种情况让我思考; SchoolId 作为分区键,用户名作为排序键。
我需要一些关于在这种情况下什么是最佳实践的想法以及一些建议,以便让我更好地理解 NoSQL 和 DynamoDb 概念。
在 NoSql 中,您应该首先尝试列出所有用例,然后尝试对 table 模式建模。
以下是我在您的应用程序中看到的用例
获取具有 userId(密码、年龄、姓名...)的一位用户的用户信息
获取用户 ID 为(class姓名、学校名称)的用户的学校信息
获取一所学校的所有学生。
获取一所学校的 class 的所有学生。
基于这些给定的访问模式,这就是我设计架构的方式
| pk | sk | GSI1 PK | GSI1 SK |
| 12345 | metadata | | | Age:13 | Last name: Singh | Name:Rohan | ...
| 12345 | schoolMeta | SchoolName: DPS | DPS#class5 | className:5 |
使用上述架构,您可以将确定的用例解决为
获取具有userId
的一位用户的用户信息Select * where pk=userId and sk=metadata
获取userId为
的用户的学校信息Select * where pk=userId and sk=schoolMeta
获取一所学校的所有学生。
Select * where pk=SchoolId from table=GSI1
将所有学生合而为一class。
Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1
但是给定的模式存在
的缺点- 如果您想更改学校名称,则必须更新太多行。