【问题标题】:Need schema for school grading system需要学校评分系统的架构
【发布时间】:2013-02-23 00:38:41
【问题描述】:

我是 SQL 新手,正在尝试创建一个可用于 Hibernate 的数据库架构,但我担心扩展问题、数据访问和查询数据的最佳方式。

项目: 学校评分系统

背景: 想要存储所有作业,但如果我们计划一所学校有 4000 名学生,每名学生有约 182 天的上课时间。如果每天有一个评分作业(课堂 + 家庭作业),那么每个作业可以有 182 x 6 x 4000,这意味着每学年有大约 430 万个成绩。 10 年内约 4370 万。

我应该能够显示每季度的所有作业和当前成绩。我也应该能够在我上学的任何一年获得这些(一次 1Q)。教师和管理员应该能够从所有存储的历史记录中检索(再次一次 1Q)。

问题:

第一季度可扩展性 会不会有性能问题? 表增长到 100M 条目有什么问题吗?

数据访问: 有没有更好的方法来拆分数据? 考虑在作业中的日期(因此是季度)之间检索每个学生的 id 成绩数据。我应该为 QuarterID 添加另一列并制作一个表格来存储它们吗?

访问等级: 查询学生季度成绩的最佳方法是什么?

  • Grade[] getStudentGrades(studentid, startdate, enddate)

自然会配合

  • Assignment[] getAssignmentDetails( Grade[] Grades )

我知道这两个可以使用 SQL 连接语句连接到另一个类 GradedAssignment:

  • GradedAssignment[] getStudentGradedAssignement(studentid, startdate, enddate)

这个架构看起来对吗? (从下面添加更新)
注意:为简洁起见,我省略了许多表格列。

学生
- 学生(PK)

学生班级(参考表)
- 类 (FK)
- 学生号(FK)

老师
- teacherid(PK)

教师课堂(参考表)
- teacherid (PK)
- 类ID

成绩(我能想到的唯一主键是与 assignmentid+studentid 复合)
- assignmentid (FK)
- 等级
- 类
- 学生编号(FK)

作业
- assignmentid (PK)
- 教师 (FK)
- 点可能
- 分配日期
- 到期日期
- 名称
- 描述

获取成绩的最佳方式是什么?

  • 选择 Assignment.pointsPossible、Assignment.name、Grade.grade FROM Grade、Assignment WHEREgrade.studentid=:id AND Grade.assignmentid == Assignment.assignmentid AND Assignment.assignDate :dateStart;

或使用 JOIN ???

  • SELECT Assignment.pointsPossible, Assignment.name, Grade.grade FROM Grade LEFT JOIN assignment on assignmentid WHERE grade.studentid=:id AND Assignment.assignDate :dateStart;

【问题讨论】:

  • 这应该是数据库表的架构吗?
  • 很笼统地说是的。足以了解正在发生的事情。

标签: sql hibernate schema


【解决方案1】:

考虑到学校的动态,我认为您的架构必须添加一些内容。例如学生每年从一个班级转到另一个班级。构建可持续应用程序时还必须考虑这些条件。

我认为一个好的架构应该是 -

学生

  • 学生号(主键)
  • 名字
  • 姓氏
  • date_of_birth
  • ....(记录所需的所有其他基本个人信息)

学生班

  • studentid(外键引用studentid)
  • classid(外键引用class.classid)
  • 录取日期
  • ...(与学生入学或升学相关的所有其他信息)

  • classid(主键)
  • 类名
  • ...(与课程相关的所有其他信息)

教师课堂

  • teacherid(外键引用teacher.teacherid)
  • classid(外键引用class.classid)
  • 分配日期
  • 发布日期
  • ...

老师

  • teacherid(主键)
  • 名字
  • 姓氏
  • 资质
  • date_of_birth
  • ...

作业

  • assignmentid(主键)
  • assigning_teacherid(外键引用teacherid)
  • 点数
  • 分配日期
  • 截止日期
  • 姓名
  • 说明
  • ...

等级

  • assignmentid (fk)
  • classid (fk)
  • 学生 (fk)
  • 等级
  • ...

您对 (assignmentid, studentid) 上的复合主键是正确的,它们也是外键。

【讨论】:

  • 我确实留下了很多东西来简化潜在的模式。我试图只为表间关系留下一些感兴趣的领域。为简洁起见,省略了其他表格。我注意到包含了诸如 StudentClass 和 TeachClass 之类的关系链接。因为成绩表会很大。你会怎么处理?
  • 也许也可以通过调整查询和数据库服务器来实现。确保要加入的表之间存在关系链接。这些不仅可以帮助您实施完整性约束,还可以通过所有 FK 上的索引为您提供更好的性能。
  • 所以模式似乎是正确的轨道。可扩展性和最佳访问方式如何?
  • 很抱歉,我无法为您提供可扩展性和访问方式方面的帮助。我没有深入休眠。
  • 嗯,我感谢您对它的基本架构验证是否在正确的轨道上。我认为 Hibernate 会为 Many 关系创建 Student/TeachClass 表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-28
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 2010-11-09
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多