sql - 学校评分系统需要架构

标签 sql hibernate schema

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

项目: 学校分级制度

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

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

问题:

Q1 可扩展性 会不会有性能问题? 表增长到 100M 条目是否有任何问题?

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

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

  • 成绩[] getStudentGrades( studentid, startdate, enddate )

自然会配合

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

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

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

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

Student
- studentid (PK)

StudentClass (Ref table)
- classid (FK)
- studentid (FK)

Teacher
- teacherid (PK)

TeacherClass (Ref table)
- teacherid (PK)
- classid

Grades (The only primary key I could think of is compound with assignmentid+studentid)
- assignmentid (FK)
- grade
- classid
- studentid (FK)

Assignment
- assignmentid (PK)
- teacherid (FK)
- pointsPossible
- assignDate
- dueDate
- name
- description

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

  • SELECT Assignment.pointsPossible, Assignment.name, Grade.grade FROM Grade,Assignment WHERE grade.studentid=:id AND Grade.assignmentid == Assignment.assignmentid AND Assignment.assignDate < :dateFinish AND Assignment.assignDate > :dateStart;

或使用 JOIN???

  • SELECT Assignment.pointsPossible, Assignment.name, Grade.grade FROM Grade LEFT JOIN Assignmentid WHERE grade.studentid=:id AND Assignment.assignDate < :dateFinish AND Assignment.assignDate > :dateStart;

最佳答案

考虑到学校的动态,我认为必须对您的架构进行一些补充。例如学生每年从一个类(class)转到另一个类(class)。还必须考虑这些条件来构建可持续的应用程序。

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

学生

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

学生类(class)

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

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

教师类

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

老师

  • teacherid(主键)
  • 名字
  • 姓氏
  • 资格
  • 出生日期
  • ...

作业

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

成绩

  • 作业编号 (fk)
  • 分类号 (fk)
  • 学生编号 (fk)
  • 年级
  • ...

关于 (assignmentid, studentid) 上的复合主键也是外键,你是对的。

关于sql - 学校评分系统需要架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15035584/

相关文章:

java - Hibernate:将表连接到连接表注释

sql - Oracle SQL - SELECT 查询锁定索引并阻止 DML session

sql - 使用 order by 时的动态 order by - 加速

mysql - 如何查看 mysql 中发出的最后一条命令?

php - 从两列中计算最多的记录

sql - 在 RDB 模式中,什么时候将列组合成单个分隔列会更好?

java - 如何在 JPA 中保留原始时区

hibernate - 如何创建名称为 'user'的表

ruby-on-rails - 如何在rails中将数据库重置回初始状态?

php - 设计一个 MySQL 数据库,我应该重新考虑它吗?