与Dynamodb的关系表

时间:2019-03-14 19:28:30

标签: nosql amazon-dynamodb relational-database

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

当前表格:

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

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

然后我意识到,我们在每个登录功能中都使用“用户名”,因此应用程序将大量使用“用户名”(有时使用密码或身份验证令牌)进行查询。这种情况让我思考。 SchoolId作为分区密钥,而Username作为排序密钥。

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

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

Select * where pk=userId and sk=metadata

使用上述架构,您可以将识别出的用例解决为

  1. 获取一个具有userId的用户的用户信息

    Select * where pk=userId and sk=schoolMeta

  2. 获取具有userId的用户的学校信息

    Select * where pk=SchoolId from table=GSI1

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

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

  4. 让所有学生都上一堂课。

    {{1}}

但是给定的架构存在以下缺点

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