昨天和今天,我研究了下Neeps数据库,复习了一下Sql语句的查询操作,发现自己还有蛮多疑惑,有待今后巩固加强!下面简单介绍下这个数据库和自己在学习过程中的心得体会。 "Neeps"数据库包含了Napier大学计算机学院2000/2001 学年的第一学期所有教学事件的详细信息。
staff表描述了教职员工的基本信息,包括的字段有组合ID,以及组合姓名,因为一个教学活动可能由多个教师来完成 ,这样描述既合乎常情,又能够减少数据的冗余。其中主键是员工ID.
student表描述了学生的基本信息,包括的字段有学生的ID,班级名称,班级规模,以及所在班级所属年级,这里学生的ID是指学生年级与所在班级的组合,如我们平常所说的2005级数据库6班,而班级名称则是课程名称与班号的组合,如平常我们所说的数据结构1班。主键是学生ID.
room表描述了教室的基本信息,包括的字段有教室ID,教室名称,容量(座位数),以及所属的教室组合,这所以有这么一个字段,我个人认为是通过查询教室信息进而查询这个教室是进行哪个教学活动,有没有和其他教学活动冲突。
event表是整个数据库最核心的一张表。通过它,可以描述整个教学过程中的所有事件。包括的字段有事件ID,由学科名称和教学种类及班号(教学T01还是演讲L01)所组合而成,学科ID,教学种类(T/L),星期,活动开始时间,持续时间以及所在教室。
modle表描述课程的基本信息。包括的字段有课程ID以及课程名称。
week表描述了教学周的开始时间信息。包括的字段有教学周ID,教学周开始日期。
attends是用于建立学生与教学事件之间多对多联系的连接表,包括的字段有学生ID,事件ID.
teaches是用于建立教师与教学事件之间多对多联系的连接表,包括的字段有教师ID,事件ID.
occurs用于建立教学事件与事件所在日期之间的多对多联系,包括事件ID以及教学周ID。
这个数据库设计最大的亮点和巧妙之处就在于对于教学事件时间信息的设计。在event表里面我们只能查询到事件发生的星期,开始时间以及持续时间,这也符合我们日常的教学习惯。我们一般问星期几有什么课,在哪里上,什么时候开始,上课时间持续多长。但是光这样设计还是不够的,仔细想想就明白了。因为课并不是每个教学周都上,它只发生在某些教学周。所以就有了occurs这张表的存在,它建立了教学事件与教学周之间的对立关系。但是为了进一步了解到每个教学周的开始时间,我们又设计了一张数据表week。这样整个教学事件发生的时间就这样一步一步被完整的描述出来了!
下面的关于这个数据库的练习,给出了部分参考答案,不知道大家有没有更好的写法。
通过ER图和表数据读懂该数据库的表与表之间的关系,本数据库主要用途是用来安排教学活动的,包含了教师、学生集体和教学活动、教室、课程、课时的关系
找出安排给某个教学活动的教室名(例如编号为co42010.L01的教学活动)。
Select name
from room join event
on room.id=event.room
where event.id='co42010.L01'
找出中某课程所包含的所有教学活动发生的日期,时间和地点。(例如编号为co72010的课程)
select wkstart,dow,tod,duration,room
from modle join event
on modle.id=event.modle
join occurs
on event.id=occurs.event
join week
on week.id=occurs.week
where modle.id='co72010'
找出某课程对应的教学活动中所有教师的集合(例如编号为co72010的课程)。
select staff.id,staff.name
from event join teaches
on event.id=teaches.event
join staff
on staff.id=teaches.staff
where modle='co72010'