报告题目:学生选课系统的数据库设计
摘 要
在当下疫情肆虐的时期,线上教学成为了主流方式,各种教学活动都转为线上,网上选课系统成为学生课程分配的主要方式,传统的选课管理模式已经无法满足当前的实际需求,为此,我们开发了学生选课管理系统。利用数据库语言设计和实现的网上选课系统,结合学生选课管理的实际需要,完成了对学生选课管理系统的需求分析、功能模块划分、数据库模式分析等,能够使学生的选课操作更加方便简洁,使高校的管理更加科学合理。此次课程设计使用Navicat for MySQL 15.0.9设计完成,首先对课题背景,数据库基础理论和SQL语言进行了简单的讨论;对系统进行了详细分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。本系统主要由四张表构成:课程表、学生表、选课表和教师表,系统可以实现学生选课的一些重要功能,可以实现课程的添加、删除,信息查询、修改、选课等。
关 键 词:数据库;选课管理系统;维护;SQL
Abstract
In the current epidemic period, online teaching has become the mainstream method, and various teaching activities have been turned to online. The online course selection system has become the main way of student course allocation. The traditional course selection management mode has been unable to meet the current actual needs. Therefore, we have developed a student course selection management system. The online course selection system designed and implemented by using database language, combined with the actual needs of students' course selection management, has completed the demand analysis, function module division, database mode analysis of students' course selection management system, which can make students' course selection operation more convenient and concise, and make the management of colleges and universities more scientific and reasonable. The course design is completed by using Navicat for MySQL 15.0.9. First, the background of the subject, basic database theory and SQL language are briefly discussed; The system is analyzed in detail and divided into specific functional modules; Finally, the design process of the application program of the student course selection system and the core code of each function module are given. The system is mainly composed of four tables: curriculum table, student table, course selection table and teacher table. The system can realize some important functions of students' course selection, and can realize the addition and deletion of courses, information query, modification, course selection, etc.
Key words: database; Course selection management system; maintain; SQL
目 录
1 设计准备... 6
1.1 需求分析... 6
1.1.1 功能性需求... 6
1.1.2 非功能性需求... 6
1.1.3 设计约束... 6
2 设计过程... 7
2.1 总体设计... 7
3 设计实现... 9
3.1 概念结构设计... 9
3.1.1 实体及属性... 9
3.2 逻辑结构设计... 9
3.2.1 关系属性... 9
3.3 物理存储结构设计... 9
3.3.1 数据库创建... 9
3.3.2 数据表创建... 10
3.3.3 数据录入... 11
3.3.4 数据操作... 13
3.3.5 创建视图... 13
3.3.6 存储过程... 16
3.3.7 创建索引... 16
3.3.8 创建触发器... 16
4 总结... 18
4.1 遇到的问题及解决措施... 18
4.1.1 问题1. 18
4.2 心得体会... 18
参考文献... 19
我们为系统总共设计了四张表,分别是Students表,Teachers表,Course表和SC表。
表格2‑1 students表
列名 | 数据类型 | 长度 | 备注 |
Sno | char | 9 | 学号、Primary key、不可为空 |
Sname | char | 20 | 姓名、可以为空 |
Ssex | char | 2 | 性别、可以为空 |
Sage | smallint | 2 | 年龄、可以为空 |
Sdept | char | 20 | 系部、可以为空 |
Scredit | smallint | 2 | 总学分、可以为空、默认值为0 |
student表即学生表的具体构成如表,student表中Sno为主键,创建列级完整性约束条件,唯一标识学生,且Sno不允许为空值,剩余的其他属性设置相应的数据类型和长度,Scredit设置初始值为0。
表格2‑2 teachers表
列名 | 数据类型 | 长度 | 备注 |
Tno | char | 9 | 工号、Primary key、不可为空 |
Tname | char | 20 | 姓名、可以为空 |
Tsex | char | 2 | 性别、可以为空 |
Tage | smallint | 2 | 年龄、可以为空 |
Tpost | char | 20 | 职称、可以为空 |
Teachers表即教师表的具体构成如表,teachers表中Tno为主键,创建列级完整性约束条件,唯一标识教师,且Tno不允许为空值。
表格2‑3 sc表
列名 | 数据类型 | 长度 | 备注 |
Sno | char | 9 | 学号、Primary key、Foreign key、不可为空 |
Cno | char | 4 | 课程号、Primary key、Foreign key、不可为空 |
Grade | smallint | 2 | 成绩、可以为空 |
sc表即学生选课表的具体构成如表,sc表中Sno和Cno同时作为主键,主码由两个属性构成,必须作为表级完整性进行定义,唯一标识学生所选的课程信息,Sno用表级完整性约束条件设为参照表students的外键,外键名称为fk_stu_sc,Cno用表级完整性约束条件设为参照表course的外键,外键名称为fk_course_sc,且Sno和Cno不允许为空值,剩余的其他属性设置相应的数据类型和长度。
表格2‑4 course表
列名 | 数据类型 | 长度 | 备注 |
Cno | char | 4 | 课程号、 Primary key、不可为空 |
Cname | char | 40 | 课程名、不可为空 |
Ccredit | smallint | 2 | 学分、可以为空 |
Tno | char | 9 | 工号、Foreign key |
course表即课程表的具体构成如表,course表中Cno为主键,唯一标识课程,且Cno和Cname不允许为空值,Tno用表级完整性约束条件设为参照表Teachers的外键,外键名称为fk_tea_course,剩余的其他属性设置相应的数据类型和长度。
学生选课系统的总体设计图所示。
图2‑1 总体设计图
图3‑1 数据库E-R图
学生(学号,姓名,性别,年龄,系部,总学分)
教师(工号,姓名,性别,年龄,职称)
课程(课程号,课程名,学分,授课教师工号)外码:授课教师工号
选课(学号,课程号,成绩)外码:学号、课程号
1.可以用SQL语句来实现数据库的创建:CREATE DATABASE xsxk;
2.也可以在MySQL中,首先创建连接,在连接上右键选择新建数据库,输入数据库名即可创建。
图3‑2 数据库创建
在此学生选课系统中共创建了四张表,分别是Students表,Teachers表,Course表和SC表。
在Students表中创建了Sno、Sname、Ssex、Sage、Sdept和Scredit关键字,其中Sno关键字为主键,用于唯一确定学生,Scredit关键字设有默认初始值0,其中Sno、Sname、Ssex、Sdept关键字的数据类型为char类型,长度不一,Sage和Scredit关键字为smallint类型,具体代码如图所示。
图3‑3 创建Students表
在Teachers表中创建了Tno、Tname、Tsex、Tage和Tpost关键字,其中Tno关键字为主键,用于唯一确定教师,其中Tno、Tname、Tsex、Tpost关键字的数据类型为char类型,长度不一,Tage关键字为smallint类型,具体代码如图所示。
图3‑4 创建Teachers表
在Course表中创建了Cno、Cname、Ccredit和Tno关键字,其中Cno关键字为主键,用于唯一确定课程,Cname关键字不允许为空,其中Cno、Cname、Tno关键字的数据类型为char类型,长度不一,Ccredit关键字为smallint类型,Tno关键字为外键,参照表为Teachers(Tno),具体代码如图所示。
图3‑5 创建Course表
在SC表中创建了Sno、Cno关键字,其中Sno关键字和Cno关键字共同构成主键,用于唯一确定学生选课关系,其中Sno、Cno关键字的数据类型为char类型,长度不一,Grade关键字为smallint类型,Sno关键字为外键,参照表为Students(Sno),Cno关键字为外键,参照表为Course(Cno),具体代码如图所示。
图3‑6 创建SC表
数据插入使用INSERT INTO<表名> [ <列名1> [ , … <列名n>] ]VALUES(值1) [… , (值n) ];语句进行数据的录入,其中:
<表名>:指定被操作的表名;
<列名>:指定需要插入数据的列名。若向表中的所有列插入数据,则全部的列名均可以省略,直接采用 INSERT<表名>VALUES(…) 即可;
VALUES或VALUE子句:该子句包含要插入的数据。
向Students表中插入数据,录入数据时要注意,在Students表中,学号为主键,唯一标志一个学生,不可以有重复值,Scredit关键字无需插入数据,设置了默认初始值0,其余关键字录入的数据不要超过设定的长度,如图所示。
图3‑7 Students表数据录入
向Teachers表中插入数据,录入数据时要注意,在Teachers表中,工号为主键,唯一标识一位教师,不可以有重复值,其余关键字录入的数据不要超过设定的长度,如图所示。
图3‑8 Teachers表数据录入
向Course表中插入数据,要注意Course表里的Tno要和Teachers表中的Tno对应,同时要确保一门课程只能有一位教师授课,一名教师可以教授多门课程的一对多的关系,Course关键字不能为空值,其余关键字录入的数据不要超过设定的长度,如图所示。
图3‑9 Course表数据录入
向SC表中插入数据,注意SC表中的Sno和Cno要在Students表和Course表中存在,否则会出现错误,如图所示。
图3‑10 SC表数据录入
对数据进行一些更新、插入、删除和查询操作
图3‑11 数据操作
MySQL 视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。数据库中只存放了视图的定义,并没有存放视图中的数据,这些数据都存放在定义视图查询所引用的真实表中。使用视图查询数据时,数据库会从真实表中取出对应的数据。因此,视图中的数据是依赖于真实表中的数据的。一旦真实表中的数据发生改变,显示在视图中的数据也会发生改变。
创建视图的语法为:create view 视图所在库库名.视图名称 as ( SELECT 表所在库库名.表名.列名 AS 列的重命名..... FROM 表所在库库名.表名);例如可以把SC表创建成视图:create view sc_view as select * from SC;
创建学生选课信息视图,结合多个表的信息,方便查看学生选课的具体情况,不必到各个表中去寻找信息,方便对比查看;创建学生选课信息视图首先要用连接查询,因为想要呈现学生的主要信息、选择的课程和相对应的授课教师,信息分布在四个表上,因此需要把students表,course表,sc表和teachers表连接起来查询;通过Sno把students表和sc表连接起来,通过Cno把sc表和course表连接起来,通过Tno把course表和teachers表连接起来,将查询结果创建为视图,命名为stu_sc_view,具体实现代码如图。
图3‑12 学生选课视图代码
创建的视图效果展示,如图所示。
图3‑13 视图展示
创建教师任课信息视图首先要用连接查询,因为想要呈现学生须选课的课程信息,包括教师的工号,姓名和职称,以及该教师所担任的课程和本门课程的学分,,信息分布在students表,course表上,将其连接起来查询;通过Tno把course表和teachers表连接起来,将查询结果创建为视图,命名为tea_cou_view,具体实现代码如图。
图3‑14 教师任课视图代码
创建的视图效果展示,如图所示。
图3‑15 视图展示
创建学生成绩信息视图首先要用连接查询,想要查询学生的成绩信息需要查找students表、course表和SC表,视图展示信息包括学生的学号,姓名,该学生修读的课程、总学分和成绩,,运用连接查询;通过Sno把students表和SC表连接起来,通过Cno将SC表和course表连接起来,将查询结果创建为视图,命名为stugrade_view,具体实现代码如图。
图3‑16 学生成绩信息视图代码
创建的视图效果展示,如图所示。
图3‑17 视图展示
创建带输出参数的存储过程。创建一个存储过程用于计算指定学生(姓名)各科成绩的平均分,存储过程中使用了一个输入参数和一个输出参数。具体代码如图。
图3‑18 存储过程
索引是MySQL数据库为了加快数据查询的速度,给表中的某一个或者是某几个列添加的一种“目录”,索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。
在本学生管理系统中,分别为students表的Sname、teachers表的Tname和course表的Cname创建索引,代码如下。
图3‑19 索引代码
触发器是一种特殊的存储过程,触发器是由事件来触发某个操作过程,事件包括insert、update和delete语句,只要当一个预定义的事件发生时,触发器将会自动执行。创建触发器的语法格式如下:
CREATE TRIGGER触发器名
AFTER/BEFORE INSERT/UPDATE/DELETE
ON表名
FOR EACH ROW
BEGIN
SQL语句;#触发程序
END;
根据当前系统的需要,创建一个触发器,当从students表删除学生记录时,同时删除该学生在sc表中的所有成绩记录。(为了实现这一操作,需要删除sc表对于students的外键约束,当触发时机为before即可避免),通过CREATE TRIGGER命令创建触发器,命名为students_delete_before,触发时机为删除之前,在students表上创建,students表每删除一行都会触发BEGIN-END程序,代码实现如图。
图3‑20 触发器级联删除代码
创建触发器实现当修改students表中学生学号时,sc表中的信息同步更新,(为了实现这一操作,需要删除sc表对于students的外键约束),通过CREATE TRIGGER命令创建触发器,命名为students_update_after,触发时机为删除之后,在students表上创建,students表每更新一行记录时,都会触发BEGIN-END程序,同步更新sc表的记录,代码实现如图。
图3‑21 触发器级联更新代码
需要注意的是,在删除students表的信息之前要用SET foreign_key_checks =0;解除外键约束,否则会删除失败并报错,同时记得执行成功后恢复外键约束。
创建触发器,实现当向sc表中插入一条成绩记录时,如果成绩合格,即大于六十分,则在students表中该学生的总分字段Scredit上累加改成绩记录对应课程的学分,通过CREATE TRIGGER命令创建触发器,命名为sc_insert_after,触发时机为删除之后,在sc表上创建,sc表插入新记录之后,会触发BEGIN-END程序,然后到 students表累加学分,在BEGIN-END程序中,首先定义一个局部变量用于存储学分,数据类型为smallint,然后从course表中查到sc表新插入的课程号相等的这门课的学分,将学分存储到临时变量中,然后判断成绩是否大于等于六十分,如果大于等于则将该学号的学生的学分累加后更新到students表的Scredit字段上,否则不累加,代码实现如图。
图3‑22 触发器级联插入代码
触发器未成功执行?
解决措施:疏忽了表有外键约束,对表中的数据进行修改就会报错,应该使用SET foreign_key_checks =0;关闭外键检查,这样就可以成功进行操作,在执行成功一点定要记得使用SET foreign_key_checks =1;恢复外键检查。
通过本次的课程设计,亲手运用数据库系统的相关知识设计完成一个系统,不仅使我更加熟悉系统设计的整体流程和步骤,而且把很多概念性的知识通过实践来感受,深刻的体会每个知识点背后的逻辑,并把其中的道理运用在生活和学习的方方面面,比如在总体设计阶段,必须要对总体的架构有所了解,在心中绘制蓝图,知道自己要做什么,应该怎么做,不能漫无目的的闭门造车,应该有的放矢。
在设计的过程中对SQL语句的运用更加熟练和有了更加深刻的理解,例如对建立基本表、视图、索引、存储过程、触发器等,都比以前更加的熟练。并在解决遇到的各种问题的过程中,学到了很多新的知识。当代码从书本上落实到指尖,你会发现大不一样,许多潜在的问题就会暴露出来,只有亲手敲过代码,解决问题,独立完成一段代码才能算是真正的掌握了知识。
上一篇:SQL中日期格式处理