1、 数据库实验报告 学院:软件工程学院 姓名:周游 学号:13130110075 班级:13011 联系方式:uchiyou@ 2015.6.9-13 1项目背景 学院对每一门课程的成绩实施透明、严格管理,并要求在每次考试结束后提交详细的考试分析报告。现有的考试成绩管理完全采用纸质的方式手工实现,容易出错且造成一定的资源浪费。为了提高考试成绩管理的效率,减少手工实现出错的机率,需要实现一个综合的成绩管理系统。成绩管理系统的具体要求如下: l 以教师为单位配备系统:要求为每一个代课教师均配备一个成绩管理系统,需要同时管理本科生与研究生的课程成绩。
2、l 与成绩管理系统相关的教师信息包括工资号、教师姓名和职称(助教、讲师、副教授、教授)。 l 与成绩管理系统相关的学生信息包括学号、姓名、性别。 l 教师每年可能会带多门课程,也可能一门课程都没有带。 l 学生可能会选修多门课程。对于必修课和限选课,必须进行选择;对于任选课程,按照学分要求自行选择。(成绩管理系统不考虑选课过程,即认为课程均已确定) l 每个学生均属于一个班级,具有一个专业方向,课程可能以专业方向为单位进行开设,也可能以班级为单位进行开设。 l 每门课程包括课程编号(学院对每一门课程的唯一编号,例如本科生课程《数据库系统概论》的编号为SE3121017,研究生课程与本
3、科生课程编号不同,例如:研究生课程《软件工程》的课程编号为1051030)、课程名称、课程类型(必修、限选和任选)、学时(X+Y的形式,其中X和Y为数字。例如《数据库系统概论》的学时为38+20)、学分、课程性质(本科生、研究生)。 l 每门课程每学年都要进行具体实施。在课程教学大纲的指导下,每年的课程教授内容可能略微不同,每门课程的内容由教学大纲的章节确定。除此以外,学院还要求详细记录每次课程实施的内容,具体格式如下表所示: 序号 讲授内容 形式(讲授、习题讲解、随堂测验、复习课程) l 每门课程的考试试卷具有两级结构:大题和小题。针对每一道题目,需要记录题目考察的具体
4、知识点。(具体要求后面有)。 l 每门课程的成绩由多个部分组成,包括:出勤成绩、平时作业成绩、大作业成绩和考试成绩,每类成绩占有一定的权重。根据权重计算最终的成绩。 l 考试结束后,教师需要进行阅卷。最终向学院提交三个文档:详细成绩单、最终成绩单和试卷分析,要求系统能够自动生成这些文档。 l 详细成绩单会将出勤成绩、平时作业成绩和大作业成绩都作为平时成绩,单独为一列,考试成绩为一列;最终成绩单仅仅记录经过加权计算后的最终成绩。成绩单的具体格式可根据题目描述自行定义。 l 试卷分析包括: n 试卷分析 u 成绩区间统计 n 分析总结(如下所示,需要记录并自动生成所有空格中的信息):
5、 本试卷中共有 三 道大题, 16 道小题 ;包含了大纲中 绝大部分 知识点;覆盖大纲知识点占(比例) 90% 。试题中难题占 34% ,适中题占 60% ,基本知识题占 28% ,试题中综合与提高性题目占 30% 。学生做对难题人数占 6% ,做对基本知识题占 80% ,综合与提高题做对比例 45% 。 n 成绩分布情况表 每门课程在考试命题前需要填写一个详细的知识点覆盖统计表,该内容也会反映到最终的考试分析报告中。考试管理系统要求对每门课程的知识点覆盖进行详细记录。 2 概要设计 根据需求设计如
6、下数据流图 第0层数据流图 第1层数据流图 第2层数据流图 第3层数据流图 请求关系概览图 说明 1 index.jsp(主页),studentManager.jsp(学生管理界面),personManager.jsp(个人管理界面),testManager.jsp(考试管理界面),courseManager(课程管理界面) 2 filter 是用于防止web端向浏览器 发送中文时乱码 3 PersonManagerServlet等servlet是用来负责数据转发和页面
7、跳转 4 dao 包中的类负责将数据库查询的数据封装到javabean中,SQL语句在这个包的类中 5 Database-util包是dao的工具类,这个包有助于降低在SQL语句和数据库具体操作之间的耦合性。读取数据库配置文件,数据库连接池,事务等处理的具体代码在这个包里面 6 数据库配置文件 主要保存数据库的连接信息(uri,用户名,密码,数据库名等)和数据库连接池的基本信息(最大连接数,连接超时时间,用户权限等) 7 Javabean 是根据用户界面中需要显示的数据而设计的数据结构,由dao封装数据后转交给相应的servlet,然后由servlet转交给相应的jsp,在jsp中读
8、取javabean数据并在相应的位置显示,然后服务器把处理好的界面发送给浏览器。 开发的时间顺序的活动图 用户界面效果图 主页 考试管理 3 E-R图 有需求画出的E-R图如图 画图工具: visio 2013 为矢量图,可复制放回visio中无损放大 E-R图设计 (1) 先画核心的环,再根据依赖关系画其他的环(先做 “老师-课程-学生-班级
9、 环) (2) 画环时,先画强实体(先画老师,课程和班级,再画学生,再画关系),再根据函数依赖画出弱实体和关系集(带课关系,选课关系等) (3) 当多对多关系时,需要为关系集建立一张表,当关系表被2个以上的实体关联时,为此关系表建立一个独立的主键(如下图中的课程实施记录和课程成绩记录), (4) 为被频繁引用但不是主键的字段创建索引 E-R图说明 作用 注释 课程成绩记录关系表 用于记录一个学生的所有科课程成绩的关系表 该表被详情成绩单表和小题平均得分表所依赖,拥有独立主键, 详情成绩单表 用于记录学生所有课程记录的详情成绩单,是
10、需要向学院提交的表单之一 该表单的符合字段 平时成绩 在创建表单时应该单独创建一个表单-平时成绩表,新的表单参照详情成绩表单,记录每一个学生的平时成绩。学院要求的最终成绩单通过该表单的数据进行加权计算得到。 小题平均得分表 用于记录每一个学生的每一个小题的得分 这张表是学生成绩统计的最基本数据表,通过获取每一个学生的每一个小题的得分,然后再参照学生的班级号,课程号和小题难易类型来统计班级或课程或个人的平均分,学院要求分析总结的课程难易的分比。弱实体集,同时参照小题ID和课程成绩记录表的主键。 小题表 用于记录所有课程的所有小题信息 是需求中课程大纲的基本数据表,强实体集,参照大题
11、表和知识点表,避免数据重复。通过在知识点表中找到小题所在大纲中的章节,然后把它封装到小题表数据结构(javabean)的集合中。 知识点表 用于记录小题表所在的大纲章节 小题和大纲章节是多对多关系,需要一张关系表来记录 大纲章节表,大题号表 用于记录所有课程的所有大纲章节或大题号 每一门课程都有一个大纲,表需要参照课程号 课程实习记录关系表 用于关联所有班级和课程的关系表, 学院要求的教师记录详细课程实施内容的表单和班级的某一课程的成绩分布表需要参照此表 课程成绩记录表 用于记录学院要求的课程实施记录 每次课程实施都是一个老师在一个课程的一个班级进行的。如果某个班级的某
12、个课程是有多个教师教授不同部分,那么一个班级的一个课程记录应该由多个老师共同完成。 4 创建数据库 根据E-R图创建相关的数据库sms,下面是利用MYSQL-workbench导出的整个数据库(创建表和插入,共18章表) 数据库表的创建 1 完整的画好并修改到达到要求后,才开始创建数据库的表 2 参照E-R图的模型和创建顺序,先创建核心环的强实体集(班级表,教师表,课程表,学生表等) 3 每次创建一张表,检查表的结构;每次完成一个环,插入部分数据进行测试 CREATE DATABASE IF NOT EXISTS `sms` /*!40100 DEFAULT C
13、HARACTER SET latin1 */; USE `sms`; -- MySQL dump 10.13 Distrib 5.6.13, for Win32 (x86) -- -- Host: 127.0.0.1 Database: sms -- ------------------------------------------------------ -- Server version 5.5.36 -- Table structure for table `class` DROP TABLE IF EXISTS `class`; /*!40101 SET @
14、saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `class` ( `class_number` int(20) NOT NULL, `major` varchar(30) NOT NULL, PRIMARY KEY (`class_number`), UNIQUE KEY `class_number` (`class_number`) ) ENGINE=InnoDB DEFAULT CHARSET=
15、latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- Dumping data for table `class` -- LOCK TABLES `class` WRITE; /*!40000 ALTER TABLE `class` DISABLE KEYS */; INSERT INTO `class` VALUES (13011,'software project'),(14011,'software'),(15011,'software'); /*!40000 ALTER TABLE `c
16、lass` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course` -- DROP TABLE IF EXISTS `course`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course` ( `course_number` int(20) NOT NULL, `cours
17、e_name` varchar(50) NOT NULL, `course_student` enum('postgraduate','undergraduate') NOT NULL, `course_type` enum('compulsory','limited','optional') NOT NULL, `course_duration` varchar(20) NOT NULL, `course_score` int(11) NOT NULL, `course_direction` enum('all','class','profession') NO
18、T NULL, PRIMARY KEY (`course_number`), UNIQUE KEY `course_number` (`course_number`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course` -- LOCK TABLES `course` WRITE; /*!40000 ALTER TABLE `course` DISAB
19、LE KEYS */; INSERT INTO `course` VALUES (1000,'database guide','undergraduate','compulsory','38+20',3,'all'),(1001,'math','undergraduate','compulsory','46+12',5,'all'),(1003,'software project','undergraduate','compulsory','38+32',3,'class'),(1004,'synchnology','undergraduate','optional','38+32',3,'
20、class'),(1005,'Chinese poem','undergraduate','optional','38+32',3,'class'); /*!40000 ALTER TABLE `course` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_detail_score` -- DROP TABLE IF EXISTS `course_detail_score`; /*!40101 SET @saved_cs_client = @@character_set
21、client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course_detail_score` ( `course_score_id` int(11) NOT NULL, `test_score` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`course_score_id`), UNIQUE KEY `course_score_id` (`course_score_id`), CONSTRAINT `score_detail_sc
22、ore_relation` FOREIGN KEY (`course_score_id`) REFERENCES `course_score_relation` (`course_score_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_detail_score` -- LOCK TABLES `course_detail_score` WRITE;
23、 /*!40000 ALTER TABLE `course_detail_score` DISABLE KEYS */; INSERT INTO `course_detail_score` VALUES (1,0),(2,0),(3,0),(4,0),(5,91),(6,82),(7,89); /*!40000 ALTER TABLE `course_detail_score` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_record` -- DROP TABLE IF EXIST
24、S `course_record`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course_record` ( `course_record_id` int(11) NOT NULL, `sequence` int(11) NOT NULL, `course_content` text, `type` set('lecture','solve exercise',
25、'course test','review') NOT NULL, `course_number` int(20) DEFAULT NULL, KEY `course_record_record_relation` (`course_record_id`), KEY `course_record_course_number` (`course_number`), CONSTRAINT `course_record_course_number` FOREIGN KEY (`course_number`) REFERENCES `course` (`course_numbe
26、r`), CONSTRAINT `course_record_record_relation` FOREIGN KEY (`course_record_id`) REFERENCES `course_record_relation` (`course_record_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_record` -- LOCK TAB
27、LES `course_record` WRITE; /*!40000 ALTER TABLE `course_record` DISABLE KEYS */; INSERT INTO `course_record` VALUES (22,1,'this is the first class, so i just teacher the outline of this semestes, the duration of my teacher is a short time,but we are happy to share the past holiday','lecture',1000)
28、23,1,'this is the first class, so i just teacher the outline of this semestes, the duration of my teacher is a short time,but we are happy to share the past holiday','lecture',1001); /*!40000 ALTER TABLE `course_record` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_rec
29、ord_relation` -- DROP TABLE IF EXISTS `course_record_relation`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course_record_relation` ( `course_record_id` int(11) NOT NULL AUTO_INCREMENT, `course_number` int(20)
30、 NOT NULL, `class_number` int(20) NOT NULL, PRIMARY KEY (`course_record_id`), KEY `record_relation_course` (`course_number`), KEY `record_relation_class` (`class_number`), CONSTRAINT `record_relation_class` FOREIGN KEY (`class_number`) REFERENCES `class` (`class_number`), CONSTRAIN
31、T `record_relation_course` FOREIGN KEY (`course_number`) REFERENCES `course` (`course_number`) ) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_record_relation` -- LOCK TABLES `course_record_
32、relation` WRITE; /*!40000 ALTER TABLE `course_record_relation` DISABLE KEYS */; INSERT INTO `course_record_relation` VALUES (1,1000,13011),(2,1001,13011),(3,1001,14011),(4,1001,15011),(22,1000,13011),(23,1001,13011),(24,1003,13011),(25,1000,13011),(26,1000,14011),(27,1000,15011),(28,1001,15011),(2
33、9,1001,14011),(30,1001,13011),(31,1003,13011),(32,1003,14011),(33,1003,15011),(34,1004,15011),(35,1004,14011),(36,1004,13011),(37,1005,13011),(38,1005,14011),(39,1005,15011); /*!40000 ALTER TABLE `course_record_relation` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_scor
34、e_range` -- DROP TABLE IF EXISTS `course_score_range`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course_score_range` ( `course_record_id` int(11) NOT NULL, `a` int(11) NOT NULL, `b` int(11) NOT NULL, `c`
35、 int(11) NOT NULL, `d` int(11) NOT NULL, KEY `score_range_score_record_relation` (`course_record_id`), CONSTRAINT `score_range_score_record_relation` FOREIGN KEY (`course_record_id`) REFERENCES `course_record_relation` (`course_record_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101
36、SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_score_range` -- LOCK TABLES `course_score_range` WRITE; /*!40000 ALTER TABLE `course_score_range` DISABLE KEYS */; INSERT INTO `course_score_range` VALUES (22,23,34,56,2),(23,13,44,46,3),(24,1,14,4,34),(25
37、1,14,4,5),(26,1,14,54,5),(27,51,13,5,54); /*!40000 ALTER TABLE `course_score_range` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_score_record` -- DROP TABLE IF EXISTS `course_score_record`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101
38、 SET character_set_client = utf8 */; CREATE TABLE `course_score_record` ( `course_score_id` int(11) NOT NULL, `ordinary_work_score` int(11) NOT NULL DEFAULT '0', `main_work_score` int(11) NOT NULL DEFAULT '0', `attendance_score` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`course_scor
39、e_id`), CONSTRAINT `course_score_record_score_detail` FOREIGN KEY (`course_score_id`) REFERENCES `course_score_relation` (`course_score_id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_score_record` -
40、 LOCK TABLES `course_score_record` WRITE; /*!40000 ALTER TABLE `course_score_record` DISABLE KEYS */; INSERT INTO `course_score_record` VALUES (1,78,98,0),(2,78,88,0),(3,78,88,0),(4,73,78,0),(5,73,78,99),(6,83,78,99); /*!40000 ALTER TABLE `course_score_record` ENABLE KEYS */; UNLOCK TABLES;
41、 -- -- Table structure for table `course_score_relation` -- DROP TABLE IF EXISTS `course_score_relation`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `course_score_relation` ( `course_score_id` int(11) NOT NULL
42、 AUTO_INCREMENT, `stu_number` varchar(20) NOT NULL, `course_number` int(20) NOT NULL, PRIMARY KEY (`course_score_id`), KEY `score_relation_student` (`stu_number`), KEY `score_relation_course` (`course_number`), CONSTRAINT `score_relation_course` FOREIGN KEY (`course_number`) REFERE
43、NCES `course` (`course_number`), CONSTRAINT `score_relation_student` FOREIGN KEY (`stu_number`) REFERENCES `student` (`stu_number`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_score_re
44、lation` -- LOCK TABLES `course_score_relation` WRITE; /*!40000 ALTER TABLE `course_score_relation` DISABLE KEYS */; INSERT INTO `course_score_relation` VALUES (1,'13130110075',1000),(2,'13130110075',1001),(3,'13130110075',1003),(4,'13130110075',1004),(5,'13140110023',1003),(6,'13140110023',100
45、0),(7,'13140110023',1001); /*!40000 ALTER TABLE `course_score_relation` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `course_teacher` -- DROP TABLE IF EXISTS `course_teacher`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_clie
46、nt = utf8 */; CREATE TABLE `course_teacher` ( `wage_number` varchar(30) NOT NULL, `course_number` int(20) NOT NULL, KEY `course_teacher_teacher` (`wage_number`), KEY `course_teacher_course` (`course_number`), CONSTRAINT `course_teacher_course` FOREIGN KEY (`course_number`) REFERENCES
47、 `course` (`course_number`), CONSTRAINT `course_teacher_teacher` FOREIGN KEY (`wage_number`) REFERENCES `teacher` (`wage_number`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `course_teacher` -- LOCK TABLES
48、 `course_teacher` WRITE; /*!40000 ALTER TABLE `course_teacher` DISABLE KEYS */; INSERT INTO `course_teacher` VALUES ('123',1000),('123',1001),('123',1004),('123456',1004),('123456',1000),('123456',1003); /*!40000 ALTER TABLE `course_teacher` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structu
49、re for table `detail_question` -- DROP TABLE IF EXISTS `detail_question`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `detail_question` ( `main_question_id` int(11) NOT NULL, `detail_question_number` int(11) NOT NULL, `score` int(11) NOT NULL DEFAULT '1', `type` enum('basic','integrity','advance') NOT NULL DEFAULT 'basic', `detail_question_id` int(11) NOT NULL AUTO_INCREMENT, `easy_level` enum('difficult','trouble some','normal','easy') DEFAULT NULL, PRIMARY KEY (`detail_question






