学校时间表的数据库模型



我正在尝试为学校时间表设计一个DB模型,但在找到一个符合我要求的模型时遇到了一些问题。

域实体:

Subject——一年内教授的内容。例如:英语、编程等

Group——一群学生。

Lesson——一个反复出现的事件,学生们被教授一些特定的科目。示例:

  • 每周一10:00教授A组编程

最初的要求非常基本。受试者CRUD。组的CRUD。能够创建跨越一段时间的重复事件。(注意:创建后不允许编辑(。

我目前使用的型号是:

Subjects
id:int
name:string
Groups
id:int
name:string
Lessons
id:int
name:string
startDate:date (ex: event starts recurring from Jan 1 2021)
endDate:date (ex: event recurring ends on Dec 31 2021)
startTime:time (ex: 10:00)
endTime:time (ex: 11:00)
dayOfWeek: flag enum that takes values Monday-Sunday
(we have more fields that are responsible for recurrence, but they are ommited as they are not very relevant to my question).

目前,整个事件系列都作为一行存储在数据库中。

这很好,但现在增加了额外的要求,我在调整我的模型以适应它们时遇到了问题。

新的要求是:

  1. 每节课给学生打分的能力
  2. 编辑课程的能力(例如,事件系列的轮班开始/结束时间为1小时;更改事件发生的日期等(
  3. 在一个系列中转移单个事件的能力(比如老师生病了,需要把讲座从周一转移到周二,只为本周一(

#1在理论上很简单-我们创建了一个新的表Grades,该表具有字段

lessonId:int
userId:int
date:date
grade:int?

但一旦我们考虑到新的需求#2(编辑课程的能力(,它就不起作用了。假设我们每周一都有一个活动。1月1日星期一发生了一起事件。我们给一些学生打分,所以我们把一些分数与那个日期挂钩。然后我们把课改在星期二而不是星期一。由于日期不再匹配,因此无法将现有成绩映射到此课程。

#2节编辑课似乎是一项非常简单的操作。。直到你考虑成绩。基本上,这个要求的唯一问题是#1 中描述的问题

#3考虑到它应该与其他需求兼容,不知道如何实现。

我需要帮助找出能够满足这些需求的数据库模型。

根据您的描述,我认为课程表还有一个subject_id和一个groups_id,您只是忘记将它们放在表列列表中。

让我们看看任务:

  1. 每节课给学生打分的能力

这并不容易。到目前为止,您有参加课程。因此,要开始此操作,您应该向数据库中添加一个students表。然后,根据学生是否可以属于多个组,您可以在学生表中拥有组ID,也可以创建一个桥接表group_student。

现在,每个";教训;这个要求中的意思?到目前为止,一节课是一个反复出现的事件(你的例子是:"每周一10:00,a组教授编程"(。这意味着你想要一个学生课程表来存储成绩。我在这里看到的唯一问题是,如果你坚持使用单个ID,你可以为一个没有参加课程的学生存储一个student_session行。使用复合ID可以解决这个问题。student_session表将包含student_id、group_id、lesson_id和grade。id在(student_id,group_id(和(group_id,lesson_id(上都有外键。

但是,如果课程意味着重复课程中的单个课程,那么您也需要一个single_lesson表。

  1. 编辑课程的能力(例如,事件系列的轮班开始/结束时间为1小时;更改事件发生的日期等(

应该没有问题。无论如何,这些只是可以更改的属性。也许你想要一张历史表,看看星期二的课是在一个月前的星期一上的,但到目前为止还没有这方面的要求。

  1. 在一个系列中转移单个事件的能力(比如老师生病了,需要将讲座从周一转移到周二,只为本周一(

也许由于需求#1,您已经有了一个single_lesson表。然后,每节课都有一行日期,有时周一会变成周二。您甚至可以同时存储两个日期,原始日期/时间,新日期/时间。甚至一条短信也是有原因的。

如果任务#1不需要一个single_lesson表,因为成绩是按每节重复课计算的,那么您只需要一个sing_lesson_exception表来处理这次必须使用原始日期/时间和新日期/时间的例外情况。

最新更新