3

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

项目:学校评分系统

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

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

问题:

Q1 可扩展性 会有性能问题吗?表增长到 100M 条目有什么问题吗?

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

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

  • Grade[] getStudentGrades(学生ID,开始日期,结束日期)

自然会配合

  • 作业 [] getAssignmentDetails( 成绩 [] 成绩 )

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

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

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

学生
- studentid (PK)

StudentClass (参考表)
- classid (FK)
- studentid (FK)

老师
-teacherid ( PK)

TeacherClass(参考表)
-teacherid PK)
-classid

成绩 (我能想到的唯一主键是与 assignmentid+studentid 复合)
- assignmentid (FK)
- Grade
- classid
- studentid (FK)

作业
- assignmentid (PK)
- teacherid (FK)
- pointsPossible
- assignDate
- dueDate
- name
- 描述

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

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

或使用 JOIN ???

  • 选择 Assignment.pointsPossible、Assignment.name、Grade.grade FROM Grade LEFT JOIN Assignment on assignmentid WHEREgrade.studentid=:id AND Assignment.assignDate < :dateFinish AND Assignment.assignDate > :dateStart;
4

1 回答 1

3

考虑到学校的动态,我认为您的模式必须有一些补充。例如,学生每年从一个班级转到另一个班级。还必须考虑这些条件以构建可持续的应用程序。

我认为一个好的模式是 -

学生

  • studentid(主键)
  • 出生日期
  • ....(记录所需的所有其他基本个人信息)

学生班

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

班级

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

教师班

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

老师

  • 教师ID(主键)
  • 资质
  • 出生日期
  • ...

任务

  • assignmentid(主键)
  • assigning_teacherid(外键引用teacher.teacherid)
  • 积分可能
  • 分配日期
  • 截止日期
  • 姓名
  • 描述
  • ...

年级

  • assignmentid (fk)
  • 类 ID (fk)
  • 学生证 (fk)
  • 年级
  • ...

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

于 2013-02-23T01:41:06.213 回答