首页 > 解决方案 > 与 Dynamodb 的关系表

问题描述

我使用关系数据库工作了很长时间,现在我将使用 DynamoDB。之后,使用关系数据库,我正在努力在 DynamoDB 中设计我们当前的一些 SQL 表。特别是,决定分区和排序键。我将尝试用一个例子来解释:

当前表:

Student: StudentId(PK), Email, First name, Last name, Password, SchoolId(FK)
School: SchoolId(PK), Name, Description

我正在考虑在 DynamoDB 中合并这些表,并使用 SchoolId 作为分区键,使用 StudentId 作为排序键。但是,我看到一些类似的示例使用 StudentId 作为分区键。

然后我意识到,我们在每个登录功能中都使用“用户名”,所以应用程序会经常使用“用户名”(有时使用密码或身份验证令牌)进行查询。这种情况让我思考;SchoolId 作为分区键,用户名作为排序键。

我需要一些关于在这种情况下最佳实践的想法以及一些建议,以使我更好地理解 NoSQL 和 DynamoDb 概念。

标签: nosqlamazon-dynamodbrelational-database

解决方案


在 NoSql 中,您应该首先尝试列出所有用例,然后尝试对表模式进行建模。

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

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

  2. 使用 userId (className, schoolName) 获取用户的学校信息

  3. 让所有学生在一所学校。

  4. 让所有学生在一所学校的一个班级。

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

|    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. 让所有学生都在一个班级。

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

但是给定的模式存在以下缺点:

  1. 如果要更改学校名称,则必须更新太多行。

推荐阅读