1.4 教学管理数据库操作任务
对数据库实施什么访问操作,得到哪些统计数据,绝不是想想就可以得出的。数据库访问操作是数据库应用系统功能分析与设计的一部分,它依赖于对应用系统调查研究,依赖于对用户的需求分析、功能及模块设计。下面我们结合上面给出的5个关系表提出一些基本的对其访问任务,以便后面利用大型数据库管理系统的技术对其实施操作。
(1)为了实现关系表数据的存储,满足多人共享访问,必须建立一个大型数据库。这里包括数据库的物理和逻辑设计两大部分,即数据库文件是存储在一个存储设备上还是多个存储设备上,数据库应用系统是通过一个数据库名访问还是需要多个数据库名。关于数据库的存储原理和创建数据库是数据库应用系统的第一个任务。
(2)关系表的基本原理,学生表、教师表、课程表、开课表和选课表如何创建,每个表如何进行完整性约束,这是第二个任务。
(3)当数据库和表创建好以后,任务就是向表输入基础数据。本书示例数据库表数据的输入正确与否,大部分通过表自身的完整性约束基本可以保证,但有些是不行的。比如开课表里的已选人数和学生表里的累计学分依赖于选课表中选课情况和最后成绩的及格,它们不是初始数据,因此为了保证这两个字段数据在学生选课或有了成绩后填入的正确性,我们将利用存储过程和触发器来完成。
(4)查询处理是本书一个最大的任务,需要什么数据,需要哪些统计分析,都需要事先有一定的规划。当然,不可能一次就完成,实际中是一个反复完善的过程。下面给出一些查询,有些在第5章中有实现,有些没有,也有第5章里有的,这里没有列出。读者可以根据第5章中的技术设计更多的检索查询。
①每个表全部数据的查询。
②每个表部分数据的查询。
③每个表满足一定条件数据的检索。
④表中数值字段数据的计算。
⑤每个学生总学分、总成绩、平均成绩的统计查询。
⑥每个班级某门课的平均成绩。
⑦某个教师所教学生的平均成绩。
⑧查询选修了某门课程的学生。
⑨查询某个同学都选修了哪些课程。
⑩检索某门课程不及格的学生。
⑪查询某个教师的上课安排。
⑫查询学生的上课安排。
(5)学生管理数据库应用的用户类型是多样的,比如有学生、教师、教务管理员等,每类用户关心的数据是不同的,因此不可能各类用户都需要数据表里的全部数据。为了数据的安全和各类用户访问数据的方便,需要设计数据视图。
(6)为了实现更复杂的数据操作,或者有些操作需要反复使用,则要通过T-SQL语言编写程序,甚至建立用户自己的函数、存储过程等。
比如:
①计算教师的工作量。因为开课表中没有显式地给出每周课时数这个必要信息,因此需要对开课时间字段中的逗号进行计数,故要用T-SQL程序实现。
②学生选课处理。每个开课计划选修人数都是有一定的人数,如果都超过,则该课程不能再增加新的选修学生,如果有一个计划没有超过,则可以在这个计划里增加选修学生,如果有多个计划都没有超过计划人数,可在任一计划里增加选修学生。需要T-SQL程序实现。
③显示指定学院每个学生选修课程情况和获取学分情况,要求先显示每个学生所选的课程,如果该门课程已经通过考试,则显示该门课程的学分,如果没有通过考试或还没有参加考试,则为0,然后显示该学生获取学分的总数。
④在开课表中,由于每一个开课号对应的学生选课都有限制,所以学生一旦选课确定,就需要和该开课号的限选人数进行比对,如果没有超过限选人数,已选人数应及时更正,以保证开课表和选课表的数据严格一致。为了纠正错误,可以使用游标,逐个检查并修改每个开课号在选课表中的学生选修人数,显示输出。
⑤在学生选课管理中,需逐个检查并修改信息学院每个学生的学分获取情况。学分获得的条件是选修该门课程,且成绩不低于60分。由于学分取得总数存放在学生表中,学生选修课程情况及成绩放在选课表中,而学生选修了某门课程及格后获取多少学分取决于选修了开课计划中哪一个开课计划,故学生学分获取情况的修改与检查是一件复杂的工作,不能由简单的查询完成,且为了维护数据的一致性,必须保证累计学分的数量应该等于学生所选的所有成绩已经及格的课程的学分总数,如果不正确,必须马上进行修改。
⑥完成对选课表的元组插入工作。要求检查所插入数据是否满足实体完整性和参照完整性,而且由于每个学生不能重复选同一门课,但是在选课表中存放的是开课计划号,并且同一门课程可能有多个开课计划,所以还必须对所选课程是否重复进行检查。
⑦在删除某开课计划时,需先查看该开课计划有没有学生注册,如果有,则不能删除。由于开课表和选课表之间建有外键级联删除约束,所以删除开课表中的开课计划,会级联删除选课表中的相应信息,所以做不到先查看该开课计划有没有学生注册。我们可以建立一个存储过程,在删除开课表信息前,先检查选课表中是否有该开课计划的注册学生,如果有,则不执行删除,否则进行删除。
⑧由于学生选课管理的实际情况,学生在期初或前一学期结束之前就进行选课,而成绩是在学期末考试后输入,所以录入成绩实际上是对选课表的数据的修改。故我们可以创建该表的修改触发器,实现学分的自动累计。由于成绩修改UPDATE语句可能涉及多个学生,故我们要在触发器中使用游标对每个学生进行判断修改。
(7)数据库应用系统的前台一般多由高级语言构建,所以数据库如何和高级语言接口,本书给出了一些例子,读者可参照实现。
(8)当上述数据库表、操作程序设计创建完成后,要真正能够使用,还必须给不同的用户分配相应的角色或权限,这样才能保证数据库应用系统的安全性。如何创建用户,如何分配权限,也是基本的任务之一。
(9)最后一个任务是数据库应用系统在使用运行中怎样实现数据备份和恢复。
以上任务设计也许不很完美,甚至有些读者还不很认同,但这不重要,因为这仅是个模拟系统,只要在本系统中“自圆其说”就可以了。有些具体任务或问题读者可能不能马上明白,但现在也不重要,随着学习,本书以后章节会一一以实例方式进行展开。
数据库应用系统的分析、设计和实现是一个庞大而复杂的过程,仅靠有限章节的一本书是不可能全面介绍的。另外,本书内容也不是对一个具体实际的数据库应用系统实例的剖析讲解,而是通过一个模拟实例,结合大型数据库管理系统的技术,模拟实现一个数据库应用系统的操作、管理和程序设计,从而使读者通过阅读本书,学会构建一个数据库应用系统的基本方法和思路,更多的细节需要读者参看其他资料在实践中体会。