在线考试系统数据库课程设计.docx

上传人:b****0 文档编号:9926432 上传时间:2023-05-22 格式:DOCX 页数:22 大小:75.52KB
下载 相关 举报
在线考试系统数据库课程设计.docx_第1页
第1页 / 共22页
在线考试系统数据库课程设计.docx_第2页
第2页 / 共22页
在线考试系统数据库课程设计.docx_第3页
第3页 / 共22页
在线考试系统数据库课程设计.docx_第4页
第4页 / 共22页
在线考试系统数据库课程设计.docx_第5页
第5页 / 共22页
在线考试系统数据库课程设计.docx_第6页
第6页 / 共22页
在线考试系统数据库课程设计.docx_第7页
第7页 / 共22页
在线考试系统数据库课程设计.docx_第8页
第8页 / 共22页
在线考试系统数据库课程设计.docx_第9页
第9页 / 共22页
在线考试系统数据库课程设计.docx_第10页
第10页 / 共22页
在线考试系统数据库课程设计.docx_第11页
第11页 / 共22页
在线考试系统数据库课程设计.docx_第12页
第12页 / 共22页
在线考试系统数据库课程设计.docx_第13页
第13页 / 共22页
在线考试系统数据库课程设计.docx_第14页
第14页 / 共22页
在线考试系统数据库课程设计.docx_第15页
第15页 / 共22页
在线考试系统数据库课程设计.docx_第16页
第16页 / 共22页
在线考试系统数据库课程设计.docx_第17页
第17页 / 共22页
在线考试系统数据库课程设计.docx_第18页
第18页 / 共22页
在线考试系统数据库课程设计.docx_第19页
第19页 / 共22页
在线考试系统数据库课程设计.docx_第20页
第20页 / 共22页
亲,该文档总共22页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

在线考试系统数据库课程设计.docx

《在线考试系统数据库课程设计.docx》由会员分享,可在线阅读,更多相关《在线考试系统数据库课程设计.docx(22页珍藏版)》请在冰点文库上搜索。

在线考试系统数据库课程设计.docx

在线考试系统数据库课程设计

 

软件工程专业

数据库原理及应用课程设计

 

 

设计题目:

在线考试系统数据库的设计与实现

年级:

*************

学号:

********

姓名:

*****

 

摘要---------------------------------------------------------------------1

第一章:

需求分析--------------------------------------------------------------3

第二章:

概念结构设计----------------------------------------------------3

第三章:

物理结构设计和逻辑结构设计--------------------------------6

第一条:

物理结构设计----------------------------------------------------6

第二条:

逻辑结构设计----------------------------------------------------7

结束语-----------------------------------------------------------------------14

第一章:

系统功能需求分析

随着标准化考试的日益普及,在各种考试中越来越多地采用了计算机考试的方式。

相对于传统的卷面考试而言,由于传统的卷面考试从出题印刷到下发试卷等环节需要较长的时间,接触的人员相对较多,因而在保密方面具有一定的困难。

而计算机考试系统采用试题库方式提供试题来源,考前无任何成套试卷,考试时考卷由计算机现场随机生成,各考生试卷不完全相同,从而避免了互相参看等作弊现象或不公平成绩的出现。

同时也可考后即可获得成绩,省去了人力评卷的麻烦和弊端。

据此,我实现了在线考试系统的数据库设计。

系统主要实现了一下几个方面的功能:

对考生而言,分为五个考试状态:

待考、就绪、考试中、结束、缺考。

考生用准考证号登录考试网站,然后验证考生信息是否一致,如果一致就会停留在考生须知界面,处于就绪状态。

所有考生等待服务器发送统一命令分发试卷并同时进入考试中状态。

在开考后20分钟后考生仍未到场,考生状态会自动设置为“缺考”,不能参加此次考试。

考试过程中可自由答题(可随时定位到每一题)。

如果有考生信息不一致的情况,可上报管理员,经审核后进行修改。

考生考完试点击“交卷”,经确认后交卷。

考后即可查看考试分数。

在到达考试时间后,服务器会自动给未交卷的考生结束考试,并可同时给所有考生评卷得出分数。

对管理员而言,可以更改数据库的所有内容,可添加、查询、修改、删除考生的信息,设置考试的相关内容。

可有选择地录入试题,为题目分类并自动在正确答案表里插入相应的标准答案。

开考前服务器可自动为每考生随机生成试卷。

考生号由管理员统一设置。

服务器会根据考试时间来自动设置考生的考试状态。

到达考试时间后,服务器可同时让所有在线考生进入答题阶段。

在考试过程中,自动为考生保存考试答案。

也可以查看所有考生的在线考试情况。

同时也可为出现异常的考生延时等详细功能。

考试全部结束后,服务器会备份所有考生信息和答题情况,并给所有考生评卷并生成所有考试成绩表,以便考生查分。

第二章:

概念结构设计

针对以上的功能分析,对数据库的设计做了以下分析。

考虑到在线考试的特殊要求,数据库的设计应该包含以下信息:

考生的基本信息用来在考生登陆时进行核对验证,防止考生信息录错的情况。

考生考试的基本信息用来控制考试时间和考生的考试状态,统计在线考生和缺考情况,同时也方便服务器统一发送命令,给所有考生同时开始考试和结束考试。

从而体现公平一致的原则。

题库应包含所有的考试类型、题目内容和每题的分值,以便以后的随机抽题和为考生评分。

并且数据库里也存储有每题对应的正确答案,考生的考试答案,这样可以方便评分。

还对考生答案做了备份,方便以后的查阅和总结考试情况,以进一步更新考试,提高考试质量。

还应把给每位考生随机生成的试题保存起来,方便查阅核对,并可由服务器统一给对应考生发送试卷。

最后把评卷的结果和考生成绩统计出来做备份,考生可在考试结束后直接查看考试结果。

如果发现有疑问地方也可随时查看和核对。

由此分析一共设计了七张表用来存储所有的考生信息和考试信息:

考生信息表(包含属性:

姓名、性别、准考证号、身份证号、所在学校)、考生考试信息表(包含属性:

考生号、准考证号、考试时间、考试状态)、题库表(包含属性:

题号、题目、题目类型、分值)、正确答案表(包含属性:

题号、标准答案)、考生试卷表(包含属性:

题号、考生号)、考生答案表(包含属性:

题号、答案、考生号)和考生成绩表(包含属性:

准考证号、成绩)。

并为每个表设置了能唯一确定每位考生的属性。

其中考生信息表里设置属性(准考证号)为主关键字,并在考生考试信息表和考生成绩表里设置属性(准考证号)为考生信息表中属性(准考证号)的外部关键字。

这样就可一一关联和对应每一位考生的信息。

在考生考试信息表里为每位考生生成一属性(考生号)并设置其为此表的主关键字。

以唯一确定每一位考生的考试时间和考试状态。

在题库中设置属性(题号)为主关键字,这样就可以唯一确定每一题,防止题目的重复,也方便随机为考生抽题。

并在考生试卷表、正确答案表和考生答案表里设置属性(题号)为外部关键字,这样就和题库中的题号一一对应起来,可减少这些表中的属性。

从而实现整个数据库设计的完整性和一致性。

在考生答案表和考生试卷表中同时设置属性(题号和考生号)为外部关键字,这样就把考生和题目联系起来。

通过关联唯一确定每位考生的试卷和答案,也方便了以后的分发试卷和为每位考生评卷。

表间对应的局部和整体E-R图如下:

(1)考生信息和考生考试信息之间的联系:

 

(2)题库和考生试卷之间的联系

 

(3)考生试卷和考生试卷之间的联系

 

(4)题库和正确答案之间的联系

 

 

5)考生信息和考生成绩之间的联系

(6)在线考试系统模型整体E-R图:

第三章逻辑结构设计和物理结构设计

第一条:

逻辑结构设计

(1)下面是将各个实体和联系转化为相应的二维表即关系模式,指定各个关系的主关键字和外部关键字,并对各个关系的约束加以限定:

考生信息表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

姓名

varchar(8)

不允许为空

性别

char

(2)

只允许取“男”或“女”

准考证号

char(6)

Yes

数字字符

身份证号

char(18)

数字字符

所在学校

varchar(16)

考生考试信息表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

考生号

char(5)

Yes

准考证号

char(6)

Yes

考生信息

数字字符

考试时间

char(22)

不允许为空

考试状态

varchar(6)

不允许为空

题库表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

题号

int

Yes

大于0

题目

varchar(100)

不允许为空

题目类型

int

1或2或3

分值

int

分值in(1,10)

备注:

其中题目类型中:

1-判断题2-填空题3-选择题

正确答案表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

题号

int

Yes

题库

大于0

标准答案

varchar(20)

Notnull

考生试卷表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

题号

int

Yes

题库

大于0

考生号

char(5)

Yes

考试考试信息

Notnull

考生答案表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

题号

int

Yes

题库

大于0

答案

Varchar(20)

可为空

考生号

Char(5)

Yes

考生考试信息

Notnull

考生成绩表

字段名

数据类型

主关键字

外部关键字

参照的表

取值说明

准考证号

Char(6)

Yes

考生信息

数字字符

成绩

int

成绩in(0,100)缺省为0

(2)所有表之间的关系图:

第二节:

物理结构设计

关系型数据库的实现:

不同的数据库产品所提供的物理环境,存取方法和存贮结构有很大的区别。

能供设计人员使用的设计变量,参数范围也很不相同,因此没有通用的物理设计方法可遵循,只能给出一般的设计内容和原则MicrosoftSQLServer2000就是关系数据库开发工具,数据库能汇集各种信息以供查询、存储和检索。

自定义窗体收集信息。

数据表示图提供了一种类似于Excel的电子表格,可以使数据库一目了然,还提供了排序功能。

MicrosoftSQLServer2000也提供了数据存储库,可以使用桌面数据库文件把数据库文件置于网络文件服务器,与其他网络用户共享数据库。

如上所述,MicrosoftSQLServer2000作为关系数据库开发具备了许多优点,可以在一个数据包中同时拥有桌面数据库的便利和关系数据库的强大功能。

为此,首先要充分了解所用DBMS的内部特征,特别是系统提供的存取方法和存取结构。

下面是具体的运行设计

(四)为了改善和优化数据库的性能和查询效果,为每个表创建了索引,具体代码如下:

/*考生信息表索引*/

createuniqueindexindex_ksxxonksxx(姓名,准考证号)

/*考生考试信息表索引*/

createuniqueindexindex_ksksxxonksksxx(考生号)

createuniqueindexindex_ksksxx1onksksxx(准考证号)

/*题库表索引*/

createuniqueindexindex_tkontk(题号)

/*正确答案表索引*/

createuniqueindexindex_zqdaonzqda(题号)

/*考生答案表索引*/

createuniqueindexindex_ksdaonksda(题号,考生号)

/*考生试卷表索引*/

createuniqueindexindex_kssjonkssj(考生号,题号)

/*成绩表索引*/

createuniqueindexindex_kscjonkscj(准考证号)

(五)为了实现表间数据的一致性和完整性,创建了触发器,具体代码如下:

/*考生信息表触发器*/

createtriggertrigger_ksxx1

onksxx

forinsert,update,delete

as

if(SELECTLEN(准考证号)FROMinserted)<6or(SELECTLEN(准考证号)FROMinserted)>6

begin

raiserror('准考证号长度不对!

',10,1)

rollbacktransaction

end

else

begin

print'添加成功!

'

end

ifexists(select*frominsertedwhere身份证号in(select身份证号fromksxx))

begin

print'身份证号已经存在!

'

return

end

/*考生考试信息表触发器*/

createtriggertrigger_ksksxx

onksksxx

forinsert,update,delete

as

ifexists(select*frominsertedwhere准考证号in(select准考证号fromksksxx))

begin

raiserror('准考证号重复!

',16,1)

rollbacktransaction

end

ifnotexists(select*frominsertedwhere考试时间like'%-%-%'+''+'%:

%-%:

%')

begin

raiserror('时间格式不对!

',16,1)

rollbacktransaction

end

ifnotexists(select*frominsertedwhere考试状态in('待考','就绪','考试中','结束','缺考'))

begin

raiserror('状态错误!

',16,1)

rollbacktransaction

end

/*题库表触发器*/

createtriggertrigger_tk

ontk

forinsert,update,delete

as

ifexists(select*frominsertedwhere题目in(select题目fromtk))

begin

raiserror('题目重复!

',16,1)

rollbacktransaction

end

ifexists(select*frominsertedwhere题目like'%?

'and题目类型=2)

begin

raiserror('题目类型错误!

',16,1)

rollbacktransaction

end

/*正确答案表触发器*/

createtriggertrigger_zqda

onzqda

forinsert,update,delete

as

ifexists(select*frominsertedwhere题号in(select题号fromzqda))

begin

raiserror('题号重复!

',16,1)

rollbacktransaction

end

/*考生答案触发器*/

createtriggertrigger_ksda

onksda

forinsert,update,delete

as

ifnotexists(select*frominsertedwhere题号>0and题号<(selectcount(题号)fromtk))

begin

raiserror('题号不在范围之内!

',16,1)

rollbacktransaction

end

ifnotexists(select*frominsertedwhere考生号in(select考生号fromksksxxwhere考试状态='考试中'))

begin

raiserror('考生号有误!

',16,1)

rollbacktransaction

end

/*考生试卷触发器*/

createtriggertrigger_kssj

onkssj

forinsert,update,delete

as

ifexists(select*frominsertedwhere考生号in(select考生号fromkssj))

begin

raiserror('考生试卷已生成!

',16,1)

rollbacktransaction

end

/*考生成绩表触发器*/

createtriggertrigger_kscj

onkscj

forinsert,update,delete

as

ifexists(select*frominsertedwhere准考证号in(select准考证号fromksksxxwhere考试状态='结束'))

begin

raiserror('准考证号错误!

',16,1)

rollbacktransaction

end

(六)对在线考试系统功能的描述,针对各功能,创建了不同的存储过程来实现,这样不但可以反复调用这些程序,大大减少了客户端的处理事务,同时也充分发挥服务器的功能,尽量减少网络上的堵塞。

根据查询功能的需要,我创建了相应的视图,基于视图创建了相应的查询存储过程,这些存储过程还包括对各表内容信息的添加、删除和更新。

并且在存储过程中也相应地加入了对数据完整性和一致性的约束条件。

同时还创建了为指定考生或所有考生随机生成试卷和对指定考生或所有考生评卷功能的存储过程。

(1)为所有考生随机生成试卷的存储过程的功能实现可简略为:

我先创建了一个游标,用来暂时保存在线考试的考生的考生号,然后采用双重while循环,外层循环用来控制游标,一条一条地读取考生号,内层循环用来为游标所定位的考生随机生成试题(我这里为了演示,只随机生成了5到题)。

当游标结束时,也就为所有的考生生成了试卷。

所谓随机就是用rand()函数在所有题号(例如1-100)之间随机生成一个随机数,由这个随机数唯一对应题库中的一道题目。

具体代码如下:

/*给单一考生生成试卷*/

createprocpro_kssj_sj

(@kshchar(5)=null)

as

ifnotexists(select*fromksksxxwhere考生号=@ksh)

begin

print'非法考生号!

'

return

end

if(selectcount(*)fromkssjwhere考生号=@ksh)<5

begin

while(selectcount(*)fromkssjwhere考生号=@ksh)<5

begin

insertintokssjvalues(1+cast(rand()*10asint),@ksh)

end

return

end

else

begin

print'题目已生成!

'

end

execpro_kssj_sj'S0001'/*执行示例*/

/*给所有考生生成试卷*/

createprocpro_all_kssj

as

ifnotexists(select*fromksksxx)

begin

print'暂无考试考生!

'

return

end

else

begin

declarecursor_all_kssjinsensitivecursor

forselect考生号fromksksxx

forreadonly

declare@ksnochar(5)

opencursor_all_kssj

fetchnextfromcursor_all_kssjinto@ksno

while(@@fetch_status=0)

begin

while(selectcount(*)fromkssjwhere考生号=@ksno)<5

begin

insertintokssjvalues(1+cast(rand()*10asint),@ksno)

end

fetchnextfromcursor_all_kssjinto@ksno

end

closecursor_all_kssj--关闭游标

deallocatecursor_all_kssj--释放游标

print'试卷已生成!

'

end

execpro_all_kssj/*执行示例*/

(2)为所有考生评卷功能的存储过程具体实现过程如下:

创建一游标读取考生答案表里的所有信息,同样采用的是双重while循环来实现此功能。

外层循环用来控制游标,并定义两个临时变量@temp和@sum,然后用内层循环来把考生答案和正确答案进行比较,如果结果一致,用变量@temp从题库表中读取此题的分值,用变量@sum来累加分值,由于每位考生只有5道题,故内层循环只循环5次,最后变量@sum中数值即位此考生的最后成绩,并通过存储过程pro_insert_cj(向考生成绩表中插入成绩)把考生成绩插入考生成绩表中。

如此循环下去,直到游标结束,即位所有考生评卷过程结束。

考生成绩表中也自动加入了每位在线考试的考生的分数。

具体实现代码如下:

/*给单一考生评分存储过程*/

createprocpro_pf

(@ksnochar(5))

as

declarecursor_pfinsensitivecursor

forselect题号,答案fromksdawhere考生号=@ksno

forreadonly

ifnotexists(select*fromksksxxwhere考生号=@ksnoand考试状态='结束')

begin

raiserror('考生考试还未结束!

',16,1)

rollbacktransaction

end

else

begin

print'考试已结束,继续!

'

end

ifnotexists(select*fromkssjwhere考生号=@ksno)

begin

print'没有此考生的答案!

'

return

end

else

begin

opencursor_pf

declare@namesysname,@resultsysname,@sumint,@tempint,@temp1int,@zkzhchar(6)

fetchnextfromcursor_pfinto@name,@result

select@sum=0

select@temp=1

select@temp1=1

while(@temp1<=5)

begin

ifexists(select*fromzqdawhere题号=@nameand标准答案=@result)

begin

select@temp=(select分值fromtkwhere题号=@name)

select@sum=@sum+@temp

select@temp1=@temp1+1

--print'haha'

--print@sum

fetchnextfromcursor_pfinto@name,@result

end

else

begin

select@temp1=@temp1+1

fetchnextfromcursor_pfinto@name,@result

end

--print'@temp1为:

'+cast(@temp1aschar)

--print'@name为:

'+cast(@nameaschar)

end

closecursor_pf--关闭游标

deallocatecursor_pf--释放游标

print@sum

select@zkzh=(select准考证号fromksksxxwhere考生号=@ksno)

execpro_insert_cj@zkzh,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2