【发布时间】: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;
【问题讨论】:
-
这应该是数据库表的架构吗?
-
很笼统地说是的。足以了解正在发生的事情。