设计某高校学生选课管理系统

因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下

题目如下:

设计某高校学生选课管理系统

  • 实现学生信息、课程学生管理;

  • 实现教师及任课信息管理;

  • 实现选课登记,要保证学生不能选修重复的课程(实用触发器实现);

  • 创建存储过程统计学生指定学期选修课程的总学分数;

  • 创建视图查询2006-2007学年,没有被选修的课程;

  • 创建存储过程统计各教师任课的学生人数;

  • 创建表间关系

前言

这部分说的是我之前的实现,和改进思路,节省时间可跳过。

因为要求对于教师和课程等等的对应关系没有说明,所以可以自由发挥,我能找到 教师和课程之间是一对一关系的 实现,但是因为我想要实现教师课程多对多的数据库,所以就自己发挥了。

当时做实验的时候,对数据的描述如下:

一名学生可以选修多门课程,一门课程可被多个学生选修,每门课程对应一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授,每个老师所任教的每门课程有一个课程评价;一个老师可教多名学生。

E-R图如下:

用Excel做的表格如下:

这个实现的问题就在于每个学生选的课程,是需要教师号和课程号一起才能共同确定的,这种情况实验要求就会很麻烦(而且E-R图上是三角多对多感觉很难受)改进思路就是将多一个临时班级实体,一个临时班级对应一个教师和一个课程,这样就可以将学生对老师和学生对课程这两个多对多关系化简成临时班级对老师,临时班级对课程这两个一对多的关系。

接下来,正文开始

数据库描述和E-R图

有要求,可转化成如下数据间关系:

一名学生可以选修多门课程,一门课程可被多个学生选修,学生先修课程的实质是选临时班级。每个临时班级对应一门课程和一个老师,每门课程有一个成绩,且选修课程名不能重复;一名教师可以任教多门课程,一门课程可由多个老师教授。

依照此描述,E-R图如下:

这里临时班级多了一个人数的属性主要是为了接下来统计人数方便。

这里可以先按照E-R图在excel上把表建出来,输一些用于插入数据时做参考和验证。

数据库建立

需要建立的东西如下(加粗为主码):

  • 实体

    学生(学号,姓名,性别,生日,专业)

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

    课程(课程号,课程名,学分,开课学期)

    临时班级(班级号,课程号,教师号,人数)

  • 关系

    选课(学号班级号,成绩)

  • 视图

    未选修06-07(班级号,课程名,教师名)

  • Trigger

    学生不能选择课程号相同的课程。

  • 存储过程

    查看指定学期的学生学分

    各教师任课的学生人数

下面是实现过程:

  • 建立选课模式

    CREATE SCHEMA select_courses;
    
  • 建立实体表

    -- student table
    CREATE TABLE students(stu_id INT PRIMARY KEY,name VARCHAR(40),birth_day DATE,sex VARCHAR(1),major VARCHAR(40)
    );-- teacher table
    CREATE TABLE teathers(tea_id INT PRIMARY KEY,name VARCHAR(40),sex VARCHAR(1)
    );-- courses table
    CREATE TABLE courses(course_id INT PRIMARY KEY,course_name VARCHAR(40),credit INT,open_time VARCHAR(20)
    );-- temp class table
    CREATE TABLE classes(class_id INT PRIMARY KEY,course_id INT,tea_id INT,number INT DEFAULT 0,FOREIGN KEY (course_id) REFERENCES courses(course_id) ON DELETE CASCADE,FOREIGN KEY (tea_id) REFERENCES teathers(tea_id) ON DELETE CASCADE
    );
    
  • 建立多对多关系表

    CREATE TABLE select_courses(stu_id INT,class_id INT,grade INT,PRIMARY KEY (stu_id, class_id),FOREIGN KEY (stu_id) REFERENCES students(stu_id) ON DELETE CASCADE,FOREIGN KEY (class_id) REFERENCES classes(class_id) ON DELETE CASCADE
    );
    
  • 插入除select_courses表以外的数据

    -- insert data into students
    INSERT INTO students VALUES(101, 'Guanyu', '1996-10-01', 'M', 'physical');
    INSERT INTO students VALUES(102, 'Zhangfei', '1997-01-03', 'M', 'physical');
    INSERT INTO students VALUES(103, 'Liubei', '1995-9-18', 'M', 'politics');
    INSERT INTO students VALUES(104, 'Sunquan', '1998-08-30', 'M', 'politics');
    INSERT INTO students VALUES(105, 'Xiaoqiao', '1999-4-21', 'F', 'art');-- insert data into teachers
    INSERT INTO teathers VALUES(201, 'Zhugeliang','M');
    INSERT INTO teathers VALUES(202, 'Zhouyu','M');
    INSERT INTO teathers VALUES(203, 'Huangzhong','M');
    INSERT INTO teathers VALUES(204, 'Caocao','M');
    INSERT INTO teathers VALUES(205, 'Daqiao','F');-- insert data into courses
    INSERT INTO courses VALUES(3001, 'history', 2, '2006-2007-1');
    INSERT INTO courses VALUES(3002, 'art of war', 3, '2006-2007-1');
    INSERT INTO courses VALUES(3003, 'archery', 3, '2006-2007-2');
    INSERT INTO courses VALUES(3004, 'stitchwork', 2, '2006-2007-2');
    INSERT INTO courses VALUES(3005, 'appreciate poetry', 3, '2007-2008-1');
    INSERT INTO courses VALUES(3006, 'language art', 2, '2007-2008-1');-- insert data into classes
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6001, 3001, 201);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6002, 3001, 204);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6003, 3002, 201);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6004, 3002, 202);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6005, 3003, 203);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6006, 3004, 205);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6007, 3005, 202);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6008, 3005, 204);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6009, 3006, 201);
    INSERT INTO classes(class_id, course_id, tea_id) VALUES(6010, 3006, 202);
    

    这里要注意,在向classes表插入数据时,不要插入人数的数据。人数将会通过触发器,每当有人选课时(即向select_courses插入数据时),对应班级人数加一,删除同理。

  • 建立改变班级人数的辅助触发器

    CREATE TRIGGER class_number_insert AFTER INSERTON select_coursesFOR EACH ROWBEGINIF NEW.class_id IN (SELECT class_id FROM classes) THENUPDATE classes SET number = number + 1 WHERE class_id = NEW.class_id;END IF;END;CREATE TRIGGER class_number_delete AFTER DELETEON select_coursesFOR EACH ROWBEGINIF OLD.class_id IN (SELECT class_id FROM classes) THENUPDATE classes SET number = number - 1 WHERE class_id = OLD.class_id;END IF;END;
    

    因为用的是datagrip,所以就没有在头尾加delimiter

  • select_courses表插入数据

    INSERT INTO select_courses VALUES(101,6001,90);
    INSERT INTO select_courses VALUES(101,6003,87);
    INSERT INTO select_courses VALUES(101,6008,80);
    INSERT INTO select_courses VALUES(102,6001,75);
    INSERT INTO select_courses VALUES(102,6002,60);
    INSERT INTO select_courses VALUES(103,6001,93);
    INSERT INTO select_courses VALUES(103,6010,85);
    INSERT INTO select_courses VALUES(103,6008,70);
    INSERT INTO select_courses VALUES(104,6004,87);
    INSERT INTO select_courses VALUES(104,6007,85);
    INSERT INTO select_courses VALUES(104,6010,80);
    INSERT INTO select_courses VALUES(105,6006,90);
    
  • 建立触发器,实现学生不能选择课程号相同的课程。若选择学生选择已选的课程,会抛出course was selected的异常。

    CREATE TRIGGER non_repetition BEFORE INSERTON select_coursesFOR EACH ROWBEGINIF (SELECT course_id FROM classes WHERE NEW.class_id = class_id)IN (SELECT classes.course_idFROM select_coursesJOIN classes ON classes.class_id = select_courses.class_idWHERE stu_id = NEW.stu_id)THENSIGNAL SQLSTATE 'HX000' SET MESSAGE_TEXT = 'course was selected';END IF;END;
    

    可以尝试插入一个错误数据,看看结果是否正确。

    INSERT INTO select_courses VALUES(101,6002,90);
    

    6002班级的课程为3001,而101学生已选的6001班级也是教3001课程的,所以理论上这个数据不应该被插入。

  • 创建视图,查询2006-2007学年没有被选修的课程

    CREATE VIEW not_selected_2006_2007AS SELECT class_id, course_name, nameFROM classesJOIN courses c on classes.course_id = c.course_idJOIN teathers t on classes.tea_id = t.tea_idWHERE number = 0 AND open_time in ('2006-2007-1','2006-2007-2');
    

    这里“未选修”对应到表上就是,课程人数为0。2006-2007学年即2006-2007-12006-2007-2两个学期。

  • 创建存储过程,查看指定学期的学生学分

    CREATEPROCEDURE get_total_credit(IN term VARCHAR(20))BEGINSELECT students.stu_id, students.name, SUM(courses.credit)FROM select_coursesJOIN classes ON classes.class_id = select_courses.class_idJOIN students ON select_courses.stu_id = students.stu_idJOIN courses ON classes.course_id = courses.course_idWHERE courses.open_time = termGROUP BY students.stu_id, name;END;
    
  • 创建存储过程,各教师任课的学生人数

    CREATE PROCEDURE num_of_students()
    BEGINSELECT t.name, c.course_name,  SUM(number) num_of_stuFROM classesJOIN courses c on classes.course_id = c.course_idJOIN teathers t on classes.tea_id = t.tea_idGROUP BY c.course_id, t.tea_id;
    END;
    

    这里会发现,结果和classes表一样,只有当你允许一个老师开好几个班上同一门课时(即班级号不同但教师号和课程号不同),才会不同。

至此,数据库建立完毕。

结语

这里的设计和原来相比,取巧的地方在于,多加了一个临时班级实体,不仅将学生对课程、学生对老师、老师对课程的三角多对多关系,转化成课程对班级、老师对班级的一对多关系和学生对班级的多对多关系;而且临时班级实体中加入的班级人数属性,可以被查询没有被选修的课程、统计教师任课的学生人数的实现加以利用,代码更简洁。

设计某高校学生选课管理系统相关推荐

  1. 学生课程成绩信息实体表设计mysql_数据库综合实验--设计某高校学生选课管理系统...

    数据库综合实验重做 因为期末的时候做数据库综合实验太匆忙,很多地方都是能用就好,做完之后突然想到可以改进的方法,所以现在寒假来重做一下 题目如下: 设计某高校学生选课管理系统 实现学生信息.课程学生管 ...

  2. 计算机课程设计SSH高校学生选课系统【代码讲解+安装调试+文档指导】

  3. 【计算机毕业设计】基于微信小程序的高校学生选课系统

    基于微信小程序的高校学生选课管理系统 毕设帮助.源码交流及指导,见文末 学生选课的需求和管理上的不断提升,学生选课管理的潜力将无限扩大,微信小程序的学生选课系统在业界被广泛关注,本网站及对此进行总体分 ...

  4. Python+mysql高校学生社团管理系统-计算机毕业设计源码00498

    高校学生社团管理系统 摘要 随着计算机科学技术的日渐成熟,人们已经深刻地认识到了计算机在各个领域中发挥的功能的强大,计算机已经进入到了人类社会发展的各个领域,并且发挥着十分重要的作用.目前学校学生社团 ...

  5. 高校学生作业管理系统计算机毕业设计源码75601

    目  录 摘要 1 绪论 1.1引言 1.2课题研究背景 1.3springboot框架介绍 1.3论文结构与章节安排 2高校学生作业管理系统系统分析 2.1 可行性分析 2.2 系统业务流程分析 2 ...

  6. 数据库课程设计-----------学生选课管理系统的设计

    由于时间关系,里面许多图片都已经变形或错位 课程设计(学年论文) 题目:学生选课管理系统的设计与实现 系    院计算机科学技术系 专    业计算机科学与技术 班    级 姓    名 学    ...

  7. C++课程设计之高校学生简单信息管理系统

    给大家分享一个用C++语言编写的高校学生信息管理系统,程序比较简单,也比较好理解,适合刚入门C++的程序小白,大学生做C++相关的课程设计也可以给你提供一些思路,或者在此基础上修改一下,添加一些自己的 ...

  8. 学生选课管理系统c语言程序报告,c语言课程设计学生选课管理系统实验报告.doc...

    课程设计报告 课程设计题目:学生选课管理系统 学 号 姓 名:李唐松 专 业:软件工程 班 级: 091107 指导老师:谢小林 2009年1月5 *实验题目: 学分管理程序 *实验时间与地点:200 ...

  9. 查询学生选修课程管理系统java_JAVA数据库课程设计学生选课管理系统的

    <JAVA数据库课程设计学生选课管理系统的>由会员分享,可在线阅读,更多相关<JAVA数据库课程设计学生选课管理系统的(59页珍藏版)>请在人人文库网上搜索. 1.一.课程设计 ...

  10. (附源码)计算机毕业设计SSM基于技术的高校学生勤工俭学管理系统的设计与开发

    (附源码)计算机毕业设计SSM基于技术的高校学生勤工俭学管理系统的设计与开发 项目运行 环境配置: Jdk1.8 + Tomcat7.0 + Mysql + HBuilderX(Webstorm也行) ...

最新文章

  1. python opencv 保存摄像头视频,以及fourc编码的介绍
  2. css textarea行数_限制textarea中的行数并使用jQuery显示行数
  3. Ampere 收购 OnSpecta,加速对云原生应用程序的 AI 推理
  4. python流程控制几种_python基础流程控制与数据类型
  5. 数据库:数据导入/数据导出
  6. bzoj 1854: [Scoi2010]游戏(并查集)
  7. C/C++_Lambda表达式
  8. 生成模型VS判别模型
  9. Eclipse,新建web项目后 出现jax-ws webservice
  10. 字符串_KMP算法(求next[]模板 hdu 1711)
  11. Swift的函数嵌套和返回内部函数
  12. Zdal分库分表、超详细一步一步实现使用zdal搭建框架
  13. sql中的两个简单嵌套
  14. ubuntu16.04快速安装zabbix
  15. Android入门,android基础开发
  16. 平衡小车simulink仿真_到底该用哪款神器来仿真我的机器人?
  17. Error running ...: No jdk for module
  18. python制作浏览器
  19. 51单片机控制二相四线步进电机
  20. 远程桌面,openGL

热门文章

  1. Lunix git stash clear 或者 git stash drop后恢复的方法
  2. [改善Java代码]使用静态内部类提高封装性
  3. 关于元素水平垂直居中的那些事?
  4. springmvc前后端传值总结
  5. Linux下使用SFTP命令
  6. Word Frequency(Leetcode192)
  7. solaris 10 oracle 11g r2安装教程,Oracle 11gR2 on Solaris 10安装技术文档(原版英文)
  8. QML Math详解 生成随机数
  9. Apache搭建http网站服务器问题记录
  10. 用系统自带的SSH实现两台linux密钥认证访问