如何使用 DynamoDb 为学生/教师/班级建模?

问题描述 投票:0回答:1

我正在对 DynamoDb 架构进行建模,该架构目前支持三个主要实体:教师、学生和班级。类实体具有以下关系:

  • 老师有课
  • 学生报名参加课程

我的访问模式是:

  1. 查找学生的时段(时段)
  2. 查找老师的课时(课时)
  3. 按时期获取学生(学生)
  4. 按时段获取老师(老师)

如果老师想要获取某个时段的学生列表,则需要执行两次查询(2, 3)。

如果学生想要获取老师的时段列表,他将需要执行多次查询(1 次和 4 次中的几次)。

这是我当前的 dynamodb 模型:

enter image description here

所有这一切都是使用单个表设计并使用相应的 pk 和 sk 来实现的。 我有一些讲座Alex Debrie,但我正在争论这是否适用于非规范化数据(在班级和注册实体中,例如学生和教师姓名)。或者如果可以接受通过多个 id 来保持设计查询。

就要求而言,我假设一个班级最多有50名学生。一位老师可能有1-5节课。我相信可以公平地说,老师或学生很少会更新他们的名字。

注意:我还阅读了以下文章,其中是学生和班级实体的邻接列表:如何使用 DynamoDB (NoSQL) 为学生/班级建模

在我的设计中,任何关于如何管理与学生和老师的班级关系的建议都会受到好评。我觉得我的设计变得过于复杂。

database-design amazon-dynamodb nosql
1个回答
0
投票

考虑到您的要求和访问模式,让我们探索使用单表方法的更简化的 DynamoDB 架构设计。

实体和访问模式

实体:

  1. 老师
  2. 学生
  3. 班级

访问模式:

  1. 为学生查找时段。
  2. 找老师上课。
  3. 按时期获取学生。
  4. 按时段获取老师。
  • 分区键(PK):基于实体类型和唯一标识符的复合键。
  • 排序键(SK):实现高效查询的复合键。

表格结构和示例项目

1. 老师

  • PK:
    TEACHER#<TeacherID>
  • SK:
    #METADATA
  • 属性:
    TeacherName
    OtherTeacherAttributes

2. 学生

  • PK:
    STUDENT#<StudentID>
  • SK:
    #METADATA
  • 属性:
    StudentName
    OtherStudentAttributes

3. 班级

  • PK:
    CLASS#<ClassID>
  • SK:
    #METADATA
  • 属性:
    ClassName
    TeacherID
    Period

4. 报名

  • PK:
    STUDENT#<StudentID>
  • SK:
    ENROLLMENT#<ClassID>
  • 属性:
    ClassID
    TeacherID
    Period
    ClassName
    TeacherName

处理访问模式

  1. 查找学生的时段:

    • 查询:
      PK = STUDENT#<StudentID> AND begins_with(SK, 'ENROLLMENT#')
    • 结果: 返回学生的所有注册情况,其中包括班级详细信息。
  2. 找老师上课:

    • 查询: 使用以下命令创建全局二级索引 (GSI):
      • GSI1PK:
        TEACHER#<TeacherID>
      • GSI1SK:
        Period
    • 查询:
      GSI1PK = TEACHER#<TeacherID> AND GSI1SK = <Period>
    • 结果: 返回该老师在指定时间段内的所有课程。
  3. 按时段获取学生:

    • 查询: 使用以下命令创建 GSI:
      • GSI2PK:
        CLASS#<ClassID>
      • GSI2SK:
        ENROLLMENT#<StudentID>
    • 查询:
      GSI2PK = CLASS#<ClassID>
    • 结果: 返回该班级注册的所有学生。
  4. 按时段获取老师:

    • 查询:
      PK = CLASS#<ClassID> AND SK = #METADATA
    • 结果: 返回班级的教师信息。

示例项目

老师

{
  "PK": "TEACHER#T123",
  "SK": "#METADATA",
  "TeacherName": "Mr. Smith",
  "OtherTeacherAttributes": {...}
}

学生

{
  "PK": "STUDENT#S456",
  "SK": "#METADATA",
  "StudentName": "Alice Johnson",
  "OtherStudentAttributes": {...}
}

班级

{
  "PK": "CLASS#C789",
  "SK": "#METADATA",
  "ClassName": "Math 101",
  "TeacherID": "T123",
  "Period": "2024-07-21T09:00:00Z"
}

报名

{
  "PK": "STUDENT#S456",
  "SK": "ENROLLMENT#C789",
  "ClassID": "C789",
  "TeacherID": "T123",
  "Period": "2024-07-21T09:00:00Z",
  "ClassName": "Math 101",
  "TeacherName": "Mr. Smith"
}

非规范化注意事项

在 DynamoDB 中,非规范化通常有利于减少查询数量。由于教师和学生姓名很少更新,因此在注册记录中复制此信息是可以接受的,并且会提高查询效率。

© www.soinside.com 2019 - 2024. All rights reserved.