学生选课系统项目设计报告
设 计 报 告
报告题目:学生选课系统的数据库设计
摘 要
在当下疫情肆虐的时期,线上教学成为了主流方式,各种教学活动都转为线上,网上选课系统成为学生课程分配的主要方式,传统的选课管理模式已经无法满足当前的实际需求,为此,我们开发了学生选课管理系统。利用数据库语言设计和实现的网上选课系统,结合学生选课管理的实际需要,完成了对学生选课管理系统的需求分析、功能模块划分、数据库模式分析等,能够使学生的选课操作更加方便简洁,使高校的管理更加科学合理。此次课程设计使用Navicat for MySQL 15.0.9设计完成,首先对课题背景,数据库基础理论和SQL语言进行了简单的讨论;对系统进行了详细分析,划分了具体的功能模块;最后,给出了学生选课系统应用程序的设计过程,以及每个功能模块的核心代码。本系统主要由四张表构成:课程表、学生表、选课表和教师表,系统可以实现学生选课的一些重要功能,可以实现课程的添加、删除,信息查询、修改、选课等。
关 键 词:数据库;选课管理系统;维护;SQL
Abstract
Key words: database; Course selection management system; maintain; SQL
目 录
- 能够储存一定数量的课程信息。
- 添加、修改、删除和查找学生的基本信息、课程的基本信息、学生选课情况的基本信息。
- 对查询、统计的结果能够列表显示。
- 能够展示教师任课信息、学生选课信息和学生成绩信息
- 安全性、可靠性、互操作性、易使用性、可维护性、可移植性、可重用性、可扩充性。
- 能够提供一定的安全机制,提供数据信息授权访问,防止随意删除、修改和查询。
- 非空约束(NOT NULL):保证该字段的值不能为空。
- 列值唯一(UNIQUE):保证该字段的值唯一。
- 完整性约束:系统完整性要求系统中数据的正确性以及相容性。
- 可通过建立主、外键,使用check 约束,或者通过使用触发器和级联更新。
我们为系统总共设计了四张表,分别是Students表,Teachers表,Course表和SC表。
表格2‑1 students表
列名 | 数据类型 | 长度 | 备注 |
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语句的运用更加熟练和有了更加深刻的理解,例如对建立基本表、视图、索引、存储过程、触发器等,都比以前更加的熟练。并在解决遇到的各种问题的过程中,学到了很多新的知识。当代码从书本上落实到指尖,你会发现大不一样,许多潜在的问题就会暴露出来,只有亲手敲过代码,解决问题,独立完成一段代码才能算是真正的掌握了知识。
来源地址:https://blog.csdn.net/qq_44928278/article/details/126521407
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341