我是 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;