与 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 模式建模。

以下是我在您的应用程序中看到的用例

  1. 获取具有 userId(密码、年龄、姓名...)的一位用户的用户信息

  2. 获取用户 ID 为(class姓名、学校名称)的用户的学校信息

  3. 获取一所学校的所有学生。

  4. 获取一所学校的 class 的所有学生。

基于这些给定的访问模式,这就是我设计架构的方式

|    pk     |     sk        |   GSI1 PK          |  GSI1 SK            |  
|  12345    |    metadata   |                    |                     | Age:13 | Last name: Singh | Name:Rohan | ...
|  12345    |    schoolMeta |  SchoolName: DPS   | DPS#class5          | className:5 | 

使用上述架构,您可以将确定的用例解决为

  1. 获取具有userId

    的一位用户的用户信息

    Select * where pk=userId and sk=metadata

  2. 获取userId为

    的用户的学校信息

    Select * where pk=userId and sk=schoolMeta

  3. 获取一所学校的所有学生。

    Select * where pk=SchoolId from table=GSI1

  4. 将所有学生合而为一class。

    Select * where pk=SchoolId and sk startswith SchoolId#className from table=GSI1

但是给定的模式存在

的缺点
  1. 如果您想更改学校名称,则必须更新太多行。