在线考试系统数据库课程设计_第1页
在线考试系统数据库课程设计_第2页
在线考试系统数据库课程设计_第3页
在线考试系统数据库课程设计_第4页
在线考试系统数据库课程设计_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、数据库原理及应用课程设计数据库系统概论课程设计开发报告设计题目:在线考试系统数据库的设计与实现年 级:学 号:姓 名:目录摘要 -1第一章:需求分析-3第二章:概念结构设计 -3第三章:物理结构设计和逻辑结构设计 -6第一条:物理结构设计 -6第二条:逻辑结构设计 -7结束语 -14第一章:系统功能需求分析随着标准化考试的日益普及,在各种考试中越来越多地采用了计算机考试的方式。相对于传统的卷面考试而言,由于传统的卷面考试从出题印刷到下发试卷等环节需要较长的时间,接触的人员相对较多,因而在保密方面具有一定的困难。而计算机考试系统采用试题库方式提供试题来源,考前无任何成套试卷,考试时考卷由计算机现

2、场随机生成,各考生试卷不完全相同,从而避免了互相参看等作弊现象或不公平成绩的出现。同时也可考后即可获得成绩,省去了人力评卷的麻烦和弊端。据此,我实现了在线考试系统的数据库设计。系统主要实现了一下几个方面的功能:对考生而言,分为五个考试状态:待考、就绪、考试中、结束、缺考。考生用准考证号登录考试网站,然后验证考生信息是否一致,如果一致就会停留在考生须知界面,处于就绪状态。所有考生等待服务器发送统一命令分发试卷并同时进入考试中状态。在开考后20分钟后考生仍未到场,考生状态会自动设置为“缺考”,不能参加此次考试。考试过程中可自由答题(可随时定位到每一题)。如果有考生信息不一致的情况,可上报管理员,经

3、审核后进行修改。考生考完试点击“交卷”,经确认后交卷。考后即可查看考试分数。在到达考试时间后,服务器会自动给未交卷的考生结束考试,并可同时给所有考生评卷得出分数。对管理员而言,可以更改数据库的所有内容,可添加、查询、修改、删除考生的信息,设置考试的相关内容。可有选择地录入试题,为题目分类并自动在正确答案表里插入相应的标准答案。开考前服务器可自动为每考生随机生成试卷。考生号由管理员统一设置。服务器会根据考试时间来自动设置考生的考试状态。到达考试时间后,服务器可同时让所有在线考生进入答题阶段。在考试过程中,自动为考生保存考试答案。也可以查看所有考生的在线考试情况。同时也可为出现异常的考生延时等详细

4、功能。考试全部结束后,服务器会备份所有考生信息和答题情况,并给所有考生评卷并生成所有考试成绩表,以便考生查分。第二章 :概念结构设计针对以上的功能分析,对数据库的设计做了以下分析。考虑到在线考试的特殊要求,数据库的设计应该包含以下信息:考生的基本信息用来在考生登陆时进行核对验证,防止考生信息录错的情况。考生考试的基本信息用来控制考试时间和考生的考试状态,统计在线考生和缺考情况,同时也方便服务器统一发送命令,给所有考生同时开始考试和结束考试。从而体现公平一致的原则。题库应包含所有的考试类型、题目内容和每题的分值,以便以后的随机抽题和为考生评分。并且数据库里也存储有每题对应的正确答案,考生的考试答

5、案,这样可以方便评分。还对考生答案做了备份,方便以后的查阅和总结考试情况,以进一步更新考试,提高考试质量。还应把给每位考生随机生成的试题保存起来,方便查阅核对,并可由服务器统一给对应考生发送试卷。最后把评卷的结果和考生成绩统计出来做备份,考生可在考试结束后直接查看考试结果。如果发现有疑问地方也可随时查看和核对。由此分析一共设计了七张表用来存储所有的考生信息和考试信息:考生信息表(包含属性:姓名、性别、准考证号、身份证号、所在学校)、考生考试信息表(包含属性:考生号、准考证号、考试时间、考试状态)、题库表(包含属性:题号、题目、题目类型、分值)、正确答案表(包含属性:题号、标准答案)、考生试卷表

6、(包含属性:题号、考生号)、考生答案表(包含属性:题号、答案、考生号)和考生成绩表(包含属性:准考证号、成绩)。并为每个表设置了能唯一确定每位考生的属性。其中考生信息表里设置属性(准考证号)为主关键字,并在考生考试信息表和考生成绩表里设置属性(准考证号)为考生信息表中属性(准考证号)的外部关键字。这样就可一一关联和对应每一位考生的信息。在考生考试信息表里为每位考生生成一属性(考生号)并设置其为此表的主关键字。以唯一确定每一位考生的考试时间和考试状态。在题库中设置属性(题号)为主关键字,这样就可以唯一确定每一题,防止题目的重复,也方便随机为考生抽题。并在考生试卷表、正确答案表和考生答案表里设置属

7、性(题号)为外部关键字,这样就和题库中的题号一一对应起来,可减少这些表中的属性。从而实现整个数据库设计的完整性和一致性。在考生答案表和考生试卷表中同时设置属性(题号和考生号)为外部关键字,这样就把考生和题目联系起来。通过关联唯一确定每位考生的试卷和答案,也方便了以后的分发试卷和为每位考生评卷。表间对应的局部和整体e-r图如下:(1)考生信息和考生考试信息之间的联系:考生考试信息姓名性别准考证号身份证号所在学校考生信息考生号准考证号考试时间考试状态考生考试信息准考证号考生号11抽题题库题号考生号题号题目mn考生试卷题号题目题目类型分值(2)题库和考生试卷之间的联系考生试卷答题题号考生号题号答案考

8、生号题号题目答案11考生答案(3)考生试卷和考生试卷之间的联系 (4)题库和正确答案之间的联系考生信息成绩考生成绩准考证号成绩11姓名性别准考证号身份证号所在学校题库答案题号题目题目类型分值题号标准答案题号答案11正确答案(5)考生信息和考生成绩之间的联系(6)在线考试系统模型整体e-r图:考生信息考生考试信息考生考试信息查看成绩考生成绩查看题目考生试卷抽题11111m1题库mm答题n考生答案11对应答案正确答案第三章逻辑结构设计和物理结构设计第一条:逻辑结构设计(1)下面是将各个实体和联系转化为相应的二维表即关系模式,指定各个关系的主关键字和外部关键字,并对各个关系的约束加以限定:考生信息表

9、字段名数据类型主关键字外部关键字参照的表取值说明姓名varchar(8)不允许为空性别char(2)只允许取“男”或“女”准考证号char(6)yes数字字符身份证号char(18)数字字符所在学校varchar(16)考生考试信息表字段名数据类型主关键字外部关键字参照的表取值说明考生号char(5)yes准考证号char(6)yes考生信息数字字符考试时间char(22)不允许为空考试状态varchar(6)不允许为空题库表字段名数据类型主关键字外部关键字参照的表取值说明题号intyes大于0题目varchar(100)不允许为空题目类型int 1或2或3分值int分值in(1,10)备注:

10、其中题目类型中:1-判断题 2-填空题 3-选择题正确答案表字段名数据类型主关键字外部关键字参照的表取值说明题号intyes题库大于0标准答案varchar(20)not null考生试卷表字段名数据类型主关键字外部关键字参照的表取值说明题号intyes题库大于0考生号char(5)yes考试考试信息not null考生答案表字段名数据类型主关键字外部关键字参照的表取值说明题号intyes题库大于0答案varchar(20)可为空考生号char(5)yes考生考试信息not null考生成绩表字段名数据类型主关键字外部关键字参照的表取值说明准考证号char(6)yes考生信息数字字符成绩int

11、成绩in(0,100) 缺省为0(2)所有表之间的关系图:第二节:物理结构设计关系型数据库的实现:不同的数据库产品所提供的物理环境,存取方法和存贮结构有很大的区别。能供设计人员使用的设计变量,参数范围也很不相同,因此没有通用的物理设计方法可遵循,只能给出一般的设计内容和原则microsoft sql server2000 就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。自定义窗体收集信息。数据表示图提供了一种类似于 excel 的电子表格,可以使数据库一目了然,还提供了排序功能。microsoft sql server2000也提供了数据存储库,可以使用桌面数据库文件把数据库

12、文件置于网络文件服务器,与其他网络用户共享数据库。如上所述, microsoft sql server2000 作为关系数据库开发具备了许多优点,可以在一个数据包中同时拥有桌面数据库的便利和关系数据库的强大功能。为此,首先要充分了解所用dbms的内部特征,特别是系统提供的存取方法和存取结构。下面是具体的运行设计 (四)为了改善和优化数据库的性能和查询效果,为每个表创建了索引,具体代码如下: /*考生信息表索引*/create unique index index_ksxx on ksxx(姓名,准考证号)/*考生考试信息表索引*/create unique index index_ksksxx

13、 on ksksxx(考生号)create unique index index_ksksxx1 on ksksxx(准考证号)/*题库表索引*/create unique index index_tk on tk(题号)/*正确答案表索引*/create unique index index_zqda on zqda(题号)/*考生答案表索引*/create unique index index_ksda on ksda(题号,考生号)/*考生试卷表索引*/create unique index index_kssj on kssj(考生号,题号)/*成绩表索引*/create unique

14、 index index_kscj on kscj(准考证号)(五)为了实现表间数据的一致性和完整性,创建了触发器,具体代码如下:/*考生信息表触发器*/create trigger trigger_ksxx1on ksxxfor insert,update,deleteasif (select len(准考证号) from inserted)6beginraiserror(准考证号长度不对!,10,1)rollback transactionendelsebeginprint 添加成功!endif exists(select * from inserted where 身份证号 in(sel

15、ect 身份证号 from ksxx)begin print 身份证号已经存在!returnend/*考生考试信息表触发器*/create trigger trigger_ksksxxon ksksxxfor insert,update,deleteasif exists(select * from inserted where 准考证号 in(select 准考证号 from ksksxx)beginraiserror(准考证号重复!,16,1)rollback transactionendif not exists(select * from inserted where 考试时间 lik

16、e %-%-%+ +%:%-%:%)beginraiserror(时间格式不对!,16,1)rollback transactionendif not exists(select * from inserted where 考试状态 in(待考,就绪,考试中,结束,缺考)beginraiserror(状态错误!,16,1)rollback transactionend/*题库表触发器*/create trigger trigger_tkon tkfor insert,update,deleteasif exists(select * from inserted where 题目 in(sele

17、ct 题目 from tk)beginraiserror(题目重复!,16,1)rollback transactionendif exists(select * from inserted where 题目 like %?and 题目类型=2)beginraiserror(题目类型错误!,16,1)rollback transactionend/*正确答案表触发器*/create trigger trigger_zqdaon zqdafor insert,update,deleteasif exists(select * from inserted where 题号 in(select 题号

18、 from zqda)beginraiserror(题号重复!,16,1)rollback transactionend/*考生答案触发器*/create trigger trigger_ksdaon ksdafor insert,update,deleteasif not exists(select * from inserted where 题号0 and 题号(select count(题号) from tk)beginraiserror(题号不在范围之内!,16,1)rollback transactionendif not exists(select * from inserted

19、where 考生号 in(select 考生号 from ksksxx where 考试状态=考试中)beginraiserror(考生号有误!,16,1)rollback transactionend/*考生试卷触发器*/create trigger trigger_kssjon kssjfor insert,update,deleteasif exists(select * from inserted where 考生号 in(select 考生号 from kssj)beginraiserror(考生试卷已生成!,16,1)rollback transactionend/*考生成绩表触发

20、器*/create trigger trigger_kscjon kscjfor insert,update,deleteasif exists(select * from inserted where 准考证号 in(select 准考证号 from ksksxx where 考试状态=结束)beginraiserror(准考证号错误!,16,1)rollback transactionend(六)对在线考试系统功能的描述,针对各功能,创建了不同的存储过程来实现,这样不但可以反复调用这些程序,大大减少了客户端的处理事务,同时也充分发挥服务器的功能,尽量减少网络上的堵塞。根据查询功能的需要,我

21、创建了相应的视图,基于视图创建了相应的查询存储过程,这些存储过程还包括对各表内容信息的添加、删除和更新。并且在存储过程中也相应地加入了对数据完整性和一致性的约束条件。同时还创建了为指定考生或所有考生随机生成试卷和对指定考生或所有考生评卷功能的存储过程。(1)为所有考生随机生成试卷的存储过程的功能实现可简略为:我先创建了一个游标,用来暂时保存在线考试的考生的考生号,然后采用双重while循环,外层循环用来控制游标,一条一条地读取考生号,内层循环用来为游标所定位的考生随机生成试题(我这里为了演示,只随机生成了5到题)。当游标结束时,也就为所有的考生生成了试卷。所谓随机就是用rand()函数在所有题

22、号(例如1-100)之间随机生成一个随机数,由这个随机数唯一对应题库中的一道题目。具体代码如下:/*给单一考生生成试卷*/create proc pro_kssj_sj(ksh char(5)=null)asif not exists(select * from ksksxx where 考生号=ksh)beginprint 非法考生号!returnendif (select count(*) from kssj where 考生号=ksh)5beginwhile (select count(*) from kssj where 考生号=ksh)5begininsert into kssj v

23、alues(1+cast(rand()*10 as int),ksh)endreturnendelsebeginprint 题目已生成!endexec pro_kssj_sj s0001 /*执行示例*/*给所有考生生成试卷*/create proc pro_all_kssjasif not exists(select * from ksksxx)beginprint 暂无考试考生!returnendelsebegindeclare cursor_all_kssj insensitive cursorfor select 考生号 from ksksxxfor read onlydeclare

24、ksno char(5)open cursor_all_kssjfetch next from cursor_all_kssj into ksnowhile(fetch_status=0)beginwhile (select count(*) from kssj where 考生号=ksno)5begininsert into kssj values(1+cast(rand()*10 as int),ksno) endfetch next from cursor_all_kssj into ksnoendclose cursor_all_kssj -关闭游标deallocate cursor_

25、all_kssj -释放游标print 试卷已生成!endexec pro_all_kssj /*执行示例*/(2)为所有考生评卷功能的存储过程具体实现过程如下:创建一游标读取考生答案表里的所有信息,同样采用的是双重while循环来实现此功能。外层循环用来控制游标,并定义两个临时变量temp和sum,然后用内层循环来把考生答案和正确答案进行比较,如果结果一致,用变量temp从题库表中读取此题的分值,用变量sum来累加分值,由于每位考生只有5道题,故内层循环只循环5次,最后变量sum中数值即位此考生的最后成绩,并通过存储过程pro_insert_cj(向考生成绩表中插入成绩)把考生成绩插入考生成

26、绩表中。如此循环下去,直到游标结束,即位所有考生评卷过程结束。考生成绩表中也自动加入了每位在线考试的考生的分数。具体实现代码如下:/*给单一考生评分存储过程*/create proc pro_pf(ksno char(5)asdeclare cursor_pf insensitive cursorfor select 题号,答案 from ksda where 考生号=ksnofor read onlyif not exists(select * from ksksxx where 考生号=ksno and 考试状态=结束)beginraiserror(考生考试还未结束!,16,1)rollb

27、ack transactionendelsebeginprint 考试已结束,继续!endif not exists(select * from kssj where 考生号=ksno)beginprint 没有此考生的答案!returnendelsebeginopen cursor_pfdeclare name sysname,result sysname,sum int,temp int,temp1 int,zkzh char(6)fetch next from cursor_pf into name,resultselect sum=0select temp=1select temp1=

28、1while(temp1=5)beginif exists(select * from zqda where 题号=name and 标准答案=result)beginselect temp=(select 分值 from tk where 题号=name)select sum=sum+tempselect temp1=temp1+1-print haha-print sumfetch next from cursor_pf into name,resultendelsebeginselect temp1=temp1+1fetch next from cursor_pf into name,r

29、esultend-print temp1为:+cast(temp1 as char)-print name为:+cast(name as char)endclose cursor_pf -关闭游标deallocate cursor_pf -释放游标print sumselect zkzh=(select 准考证号 from ksksxx where 考生号=ksno)exec pro_insert_cj zkzh,sum/*print 分数为:+cast(sum as char)*/endexec pro_pf s0005 /*执行示例*/*给所有考生评分存储过程*/create proc p

30、ro_all_pfasdeclare cursor_pf insensitive cursorfor select 题号,答案,考生号 from ksda order by 考生号for read onlybeginopen cursor_pfdeclare name sysname,result sysname,sum int,temp int,temp1 int,zkzh char(6),ksno char(5),ksno1 char(5)fetch next from cursor_pf into name,result,ksnowhile(fetch_status=0)beginsel

31、ect sum=0select temp=1select temp1=1while(temp1=5)beginif not exists(select * from ksksxx where 考生号=ksno and 考试状态=结束)beginprint 考生考试还未结束!continueendelsebeginprint 考试已结束,继续!endif exists(select * from zqda where 题号=name and 标准答案=result)beginselect temp=(select 分值 from tk where 题号=name)select sum=sum+tempselect temp1=temp1+1-print haha-print sumfetch next from cursor_pf into

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论