学生选课系统项目设计报告

设 计 报 告

报告题目:学生选课系统的数据库设计

摘  要

在当下疫情肆虐的时期,线上教学成为了主流方式,各种教学活动都转为线上,网上选课系统成为学生课程分配的主要方式,传统的选课管理模式已经无法满足当前的实际需求,为此,我们开发了学生选课管理系统。利用数据库语言设计和实现的网上选课系统,结合学生选课管理的实际需要,完成了对学生选课管理系统的需求分析、功能模块划分、数据库模式分析等,能够使学生的选课操作更加方便简洁,使高校的管理更加科学合理。此次课程设计使用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. 设计准备

    1. 需求分析
      1. 功能性需求
  1. 能够储存一定数量的课程信息。
  2. 添加、修改、删除和查找学生的基本信息、课程的基本信息、学生选课情况的基本信息。
  3. 对查询、统计的结果能够列表显示。
  4. 能够展示教师任课信息、学生选课信息和学生成绩信息
      1. 非功能性需求
  1. 安全性、可靠性、互操作性、易使用性、可维护性、可移植性、可重用性、可扩充性。
  2. 能够提供一定的安全机制,提供数据信息授权访问,防止随意删除、修改和查询。
      1. 设计约束
  1. 非空约束(NOT NULL):保证该字段的值不能为空。
  2. 列值唯一(UNIQUE):保证该字段的值唯一。
  3. 完整性约束:系统完整性要求系统中数据的正确性以及相容性。
  4. 可通过建立主、外键,使用check 约束,或者通过使用触发器和级联更新。

 
  1. 设计过程

    1. 总体设计

我们为系统总共设计了四张表,分别是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 总体设计图

 
  1. 设计实现

    1. 概念结构设计
      1. 实体及属性

图3‑1 数据库E-R图

    1. 逻辑结构设计
      1. 关系属性

学生(学号,姓名,性别,年龄,系部,总学分)

教师(工号,姓名,性别,年龄,职称)

课程(课程号,课程名,学分,授课教师工号)外码:授课教师工号

选课(学号,课程号,成绩)外码:学号、课程号

    1. 物理存储结构设计
      1. 数据库创建

1.可以用SQL语句来实现数据库的创建:CREATE DATABASE xsxk;

2.也可以在MySQL中,首先创建连接,在连接上右键选择新建数据库,输入数据库名即可创建。

图3‑2 数据库创建

      1. 数据表创建

在此学生选课系统中共创建了四张表,分别是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表

      1. 数据录入

数据插入使用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表数据录入

      1. 数据操作

对数据进行一些更新、插入、删除和查询操作

图3‑11 数据操作

      1. 创建视图

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 视图展示

      1. 存储过程

创建带输出参数的存储过程。创建一个存储过程用于计算指定学生(姓名)各科成绩的平均分,存储过程中使用了一个输入参数和一个输出参数。具体代码如图。

图3‑18 存储过程

      1. 创建索引

索引是MySQL数据库为了加快数据查询的速度,给表中的某一个或者是某几个列添加的一种“目录”,索引是一种用于快速查询和检索数据的数据结构。常见的索引结构有: B 树, B+树和 Hash。

在本学生管理系统中,分别为students表的Sname、teachers表的Tname和course表的Cname创建索引,代码如下。

图3‑19 索引代码

      1. 创建触发器

触发器是一种特殊的存储过程,触发器是由事件来触发某个操作过程,事件包括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 触发器级联插入代码

 
  1. 总结

    1. 遇到的问题及解决措施
      1. 问题1

触发器未成功执行?

解决措施:疏忽了表有外键约束,对表中的数据进行修改就会报错,应该使用SET foreign_key_checks =0;关闭外键检查,这样就可以成功进行操作,在执行成功一点定要记得使用SET foreign_key_checks =1;恢复外键检查。

    1. 心得体会

通过本次的课程设计,亲手运用数据库系统的相关知识设计完成一个系统,不仅使我更加熟悉系统设计的整体流程和步骤,而且把很多概念性的知识通过实践来感受,深刻的体会每个知识点背后的逻辑,并把其中的道理运用在生活和学习的方方面面,比如在总体设计阶段,必须要对总体的架构有所了解,在心中绘制蓝图,知道自己要做什么,应该怎么做,不能漫无目的的闭门造车,应该有的放矢。

在设计的过程中对SQL语句的运用更加熟练和有了更加深刻的理解,例如对建立基本表、视图、索引、存储过程、触发器等,都比以前更加的熟练。并在解决遇到的各种问题的过程中,学到了很多新的知识。当代码从书本上落实到指尖,你会发现大不一样,许多潜在的问题就会暴露出来,只有亲手敲过代码,解决问题,独立完成一段代码才能算是真正的掌握了知识。

  • 25
    点赞
  • 349
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
好的,关于学生选课系统数据库设计,我可以给您一些建议。 首先,需要确定系统中需要存储哪些信息。通常包括以下内容: 1. 学生信息:包括学生ID、姓名、性别、出生日期、联系方式等。 2. 课程信息:包括课程ID、课程名称、授课教师、上课时间、上课地点等。 3. 选课信息:包括学生ID、课程ID、选课时间、成绩等。 4. 教师信息:包括教师ID、姓名、性别、出生日期、联系方式等。 5. 班级信息:包括班级ID、班级名称、班主任等。 6. 学院信息:包括学院ID、学院名称、院长等。 接下来,可以考虑如何设计数据库表结构。一般来说,可以按照实体关系来设计表结构,比如学生、课程、选课、教师、班级、学院等。 例如,可以设计以下表结构: 1. 学生表(student):包括学生ID、姓名、性别、出生日期、联系方式等字段。 2. 课程表(course):包括课程ID、课程名称、授课教师、上课时间、上课地点等字段。 3. 选课表(select_course):包括学生ID、课程ID、选课时间、成绩等字段。 4. 教师表(teacher):包括教师ID、姓名、性别、出生日期、联系方式等字段。 5. 班级表(class):包括班级ID、班级名称、班主任等字段。 6. 学院表(college):包括学院ID、学院名称、院长等字段。 注意,在设计表结构时需要考虑到数据的完整性和一致性,需要设置适当的约束条件和关联关系。 希望以上建议对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值