收藏 分销(赏)

学生成绩管理系统数据库设计文档---(全).doc

上传人:精*** 文档编号:4063268 上传时间:2024-07-26 格式:DOC 页数:25 大小:135.54KB
下载 相关 举报
学生成绩管理系统数据库设计文档---(全).doc_第1页
第1页 / 共25页
学生成绩管理系统数据库设计文档---(全).doc_第2页
第2页 / 共25页
点击查看更多>>
资源描述
“学生成绩管理"数据库设计文档 0、前言(一些必要的说明。) 0。1 数据库说明 数据库名:PXSCJ 逻辑名称:学生成绩数据库 数据文件:PXSCJ.mdf 日志文件:PXSCJ_Log 登录名:admin,密码:123456 0.2表命名说明 Cjb:成绩表,保存选课信息 Cxb:查询表,记录boolean值对应信息,1代表男,0代表女. Kcb:课程表。 Tjb:统计表,统计成绩段分布。 Xsb:学生表. Yhb:用户表,保存系统用户信息. Jsb: 教师表。 Skb:授课表,记录授课信息。 0。3 系统功能模块图 1、 需求分析阶段 说明:学生成绩管理系统需要实现以下功能:一个学生可以选修多门课程,一门课程可以由多个学生选修,学生选修一门课会有一个成绩.一个教师可以教授多个班级,一个教师也可以教授多门课程,一个班级有多个学生,一门课程也可以由多个老师来上,一个老师给一个班级上一门课有确定的时间和地点。不同的用户根据身份不同拥有不同的权限. (1) 数据流图 老师—--—成绩管理,学生信息管理,权限管理—-—学生成绩管理系统—成绩查询——学生 (要求:用visio实现第一层数据流图,第二层数据流图,第三层数据流图)p121 第一层数据流图 第二层数据流图 第三层数据流图(略) (2) 数据字典 (每个实体的详细说明) 数据库编号:pxscj 基表编号:f1 基表英文名称:yhb 基表中文名称:用户表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Yhbh 用户编号 Char(6) 2 yhm 用户名 Char(8) 3 sf 身份 Varcha(20) 4 mm 密码 Char(6) 5 bz 备注 Varcha(50) 说明: 数据库编号:pxscj 基表编号:f2 基表英文名称:cjb 基表中文名称:成绩表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Xh 学号 Char(6) 2 Kch 课程号 Char(3) 3 Cj 成绩 Int 说明:xh参照学生表的xh;kch参照课程表的kch;cj介于0—100之间。 数据库编号:pxscj 基表编号:f3 基表英文名称:kcb 基表中文名称:课程表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Xh 学号 Char(6) 2 XM 姓名 Char(8) 3 XB 性别 Bit 4 CSSJ 出生时间 Datetime 5 Bj 班级 Varchar(50) 6 Zy 专业 Char(12) 7 ZXH 总学分 Int 8 Lxfs 联系方式 Varchar(50) 9 zp 照片 Varbinary(MAX) 10 BZ Varchar(500) 说明:xh参照学生表的xh;kch参照课程表的kch;cj介于0—100之间。xb参照查询表的xb 数据库编号:pxscj 基表编号:f4 基表英文名称:jsb 基表中文名称:教师表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Jsbh 教师编号 Char(6) 2 Jsxm 教师姓名 Char(8) 3 zy 专业 Varchar(30) 4 Fy 分院 Varchar(30) 5 Zc 职称 Varchar(20) 6 Zc 职务 Varchar(20) 7 Bz Varchar(50) 说明:xh参照学生表的xh;kch参照课程表的kch;cj介于0-100之间. 数据库编号:pxscj 基表编号:f5 基表英文名称:kcb 基表中文名称:课程表 字段编号 英文字段名 中文字段名 字段类型 备注 1 KCH 课程号 Char(3) 2 KCM 课程名 Char(16) 3 Cj 成绩 Int 说明:xh参照学生表的xh;kch参照课程表的kch;cj介于0—100之间. 数据库编号:pxscj 基表编号:f6 基表英文名称:cjb 基表中文名称:课程表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Xh 学号 Char(6) 2 Kch 课程号 Char(3) 3 KKXQ Tinyint 4 XS 学生 tinyint 5 XF 学分 tinyint 说明:xh参照学生表的xh;kch参照课程表的kch; 数据库编号:pxscj 基表编号:f7 基表英文名称:skb 基表中文名称:授课表 字段编号 英文字段名 中文字段名 字段类型 备注 1 Jsbh 教师编号 Char(6) 2 Kch 课程号 Char(3) 3 Bj 班级 Varchar(50) 4 Sj 时间 Varchar(50) 5 dd 地点 Varchar(50) 说明:jsbh参照教师表的jsbh;kch参照课程表的kch; 数据库编号:pxscj 基表编号:f8 基表英文名称:CXB 基表中文名称:查询表 字段编号 英文字段名 中文字段名 字段类型 备注 1 XB 性别 Bit 2 XBM 性别名 Char(4) 说明: 2、 概念设计阶段 (1) 分ER图 (两个分ER图,1)学生和课程,2)教师,课程,班级) (2) 总ER图 (由分ER图画出总ER图) 3、 逻辑设计阶段 (1) 表关系图 (看是否可以画出) (2) 表结构图 Xsb结构 Kcb结构 Cjb结构 Yhb结构 Jsb结构 Skb结构 Tjb结构 Cxb结构 (3) 表优化(判断每个关系是否达到3NF要求,如果没有达到,则继续规范) 按照(1nf—>2nf-〉3nf进行判断和优化) Cjb(xh,kch,cj) 码:(xh,kch) 非主属性:cj 因为cj完全依赖于(xh,kch),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Cxb(xb,xbm) 码:(xbm) 非主属性:xb 因为xb完全依赖于(kch),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Jsb(jsbh,jsxm,zy,fy,zc,zw,bz) 码:(jsbh) 非主属性:jsxm,zy,fy,zc,zw,bz 因为jsxm,zy,fy,zc,zw,bz完全依赖于(kch),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Kcb(kch,kcm,kkxq,xs,xf) 码:(kch) 非主属性:kcm,kkxq,xs,xf 因为kcm,kkxq,xs,xf完全依赖于(kch),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Skb(jsbh,kch,bj,sj,dd) 码:(jsbh,kch,bj) 非主属性:sj,dd 因为sj,dd完全依赖于(jsbh,kch,bj),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Tjb(kch,rs1,rs2,rs3,rs4,rs5) 码:(kch) 非主属性:rs1,rs2,rs3,rs4,rs5 因为rs1,rs2,rs3,rs4,rs5完全依赖于(kch),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Xsb(xh,xm,xb,cssj,bj,zy,zxf,bz,lxfs,zp) 码:(xh) 非主属性:xm,xb,cssj,bj,zy,zxf,bz,lxfs,zp 因为xm,xb,cssj,bj,zy,zxf,bz,lxfs,zp完全依赖于(xh),所以属于2NF 因为不存在传递函数依赖,所以属于3NF Yhb(yhbh,yhm,mm,bz) 码:(yhbh) 非主属性:yhm,mm,bz 因为yhm,mm,bz完全依赖于(yhbh),所以属于2NF 因为不存在传递函数依赖,所以属于3NF 4、物理设计 选择合适的DBMS(要求用sql server 2008) 5、实施(把sql语句贴在下面) (1)创建数据库 (把sql语句贴在下面) createdatabasepxscj1 on ( name=’pxscj1_data', filename='f:\pxscj1_data。mdf', size=3mb, filegrowth=10% ) logon ( name=’pxscj1_log', filename=’f:\pxscj1_log。ldf’, size=4mb, maxsize=6mb, filegrowth=1mb ) (2)创建表 (把sql语句贴在下面) createtablexsb( xhchar(6)notnullprimarykey, xmchar(8)notnull, xbbit, cssjdatetime, bjvarchar(50)notnull, zychar(12), zxfint, bzvarchar(500), lxfsvarchar(50), zpvarbinary(max) ) createtablekcb( kchchar(3)notnullprimarykey, kcmchar(16)notnull, kkxqtinyint, xstinyint, xftinyint ) createtablecjb( xhchar(6), kchchar(6), cjint, constraintc1primarykey(xh,kch) ) createtableyhb( yhbhchar(6)primarykeynotnull, yhmchar(8), sfvarchar(20), mmchar(6), bzvarchar(5) ) createtablejsb( jsbhchar(6)notnullprimarykey, jsxmchar(8), zyvarchar(30), fyvarchar(30), zcvarchar(20), zwvarchar(20), bzvarchar(50) ) createtableskb( jsbhchar(6)notnull, kchchar(3)notnull, bjvarchar(50)notnull, sjvarchar(20), ddvarchar(50), constraintc2primarykey(jsbh,kch,bj) ) createtabletjb( kchchar(3)primarykeynotnull, rs1int, rs2int, rs3int, rs4int, rs5int ) createtablecxb( xbbitnotnull, xbmchar(4)notnullprimarykey ) (3)数据库完整性 2)视图 学生选课情况视图(学号,姓名,课程号,课程名,成绩,学分,总学分,教师) createviewxs_xk_view as selectxsb。XH,XM,kcb。KCH,kcm,CJ,xf,zxf,jsb.jsbh,jsxm fromxsb,KCB,CJB,jsb,skb wherexsb。XH=cjb。XHandkcb。KCH=cjb。KCH andcjb.KCH=skb。kchandskb。jsbh=jsb.jsbh select*fromxs_xk_view 3)自定义数据库类型 学号,课程号可以考虑用自定义的数据类型。 sp_addtype’xh’,’char(6)' sP_addtype'kch’,'char(3)' 4)默认值对象 Xsb:性别默认为1,总学分默认为0。 Kcb:学生人数默认为40,学分默认为2。 Jsb:zy计算机,fy信息,zc讲师,zw无。 Yhb:mm'123456’ Xsb:性别默认为1, altertablexsbaddconstraintb1DEFAULT 1 forxb 总学分默认为0. altertablexsbaddconstraintb2DEFAULT 0 forzxf Kcb:学生人数默认为40, altertablekcbaddconstraintb3DEFAULT 40 forxs 学分默认为2. altertablekcbaddconstraintb4DEFAULT 2 forxf Jsb:zy计算机, altertablejsbaddconstraintb5DEFAULT’计算机’forzy fy信息, altertablejsbaddconstraintb6DEFAULT’信息’forfy zc讲师, altertablejsbaddconstraintb7DEFAULT’讲师'forzc zw无。 altertablejsbaddconstraintb8DEFAULT'无’forzw Yhb:mm'123456’ altertableyhbaddconstraintb9DEFAULT'123456’formm 5)规则和check约束 Xsb:zxf范围在0-160之间。 Kcb:kkxq范围在1-8之间,xf在1—15之间 Cjb:cj范围在0—100之间 Xsb:zxf在0-160之间。 altertablexsb addconstraintpk_1check (zxfbetween 0 and 160) Kcb:kkxq在1-8之间,xf在1—15之间 altertablekcb addconstraintpk_2check (kkxqbetween 1 and 8) altertablekcb addconstraintpk_3check (xfbetween 1 and 15) Cjb:cj在0-100之间 altertablecjb addconstraintpk_4check (cjbetween 0 and 100) 6)参照关系 cjb(xh)参照xsb(xh) cjb(kch)参照kcb(kch) yhb(yhbh)参照xsb(xh)和jsb(jsbh)–必须用触发器实现 skb(jsbh)参照jsb(jsbh) skb(bj)参照xsb(bj) skb(kch)参照kcb(kch) cjb(xh)—xsb(xh) altertablecjb addconstraintfk_1foreignkey (xh)referencesxsb(xh) cjb(kch)-kcb(kch) altertablecjb addconstraintfk_2foreignkey (kch)referenceskcb(kch) skb(jsbh)—jsb(jsbh) altertableskb addconstraintfk_4foreignkey (jsbh)referencesjsb(jsbh) skb(kch)—kcb(kch) altertableskb addconstraintfk_6foreignkey (kch)referenceskcb(kch) skb(bj)-xsb(bj)——用触发器实现 createtriggert1onskb forinsert as begin ifnotexists(select*fromxsbwherebj=(selectbjfrominserted)) begin print’插入的班级不存在!' rollbacktransaction end end yhb(yhbh)—xsb(xh)和jsb(jsbh)--必须用触发器实现 altertriggert2onyhb forinsert as begin ifnotexists(select*fromxsbwherexh=(selectyhbhfrominserted)) begin ifnotexists(select*fromjsbwherejsbh=(selectyhbhfrominserted)) begin print'插入的编号出错!’ rollbacktransaction end end end (4) 用户自定义函数 (把sql语句贴在下面) (5) 用户自定义存储过程 1) 根据学号查询学生的选课情况 (把sql语句贴在下面) CREATEPROCEDURExhcxxs@xhchar(6) as begin ifexists(select*fromcjbwherexh=@xh) select*fromcjbwherexh=@xh else print’无此学生选课信息’ end 2) 根据课程号查询课程的选修情况 (把sql语句贴在下面) CREATEPROCEDUREkchcxxk@kchchar(3) as begin ifexists(select*fromcjbwherekch=@kch) select*fromcjbwherekch=@kch else print’无此课程选课信息’ end 根据教师编号查询授课情况 (把sql语句贴在下面) CREATEPROCEDUREjsbhcxsk@jsbhchar(6) as begin ifexists(select*fromskbwherejsbh=@jsbh) select*fromskbwherejsbh=@jsbh else print'无此教师授课信息’ end 3) 根据班级查询该班级的授课情况 (把sql语句贴在下面) CREATEPROCEDUREbjcxsk@bjvarchar(50) as begin ifexists(select*fromskbwherebj=@bj) select*fromskbwherebj=@bj else print'无此班级授课信息' end 4) 根据课程号号查看授课情况 (把sql语句贴在下面) CREATEPROCEDUREkchcxsk@kchchar(3) as begin ifexists(select*fromskbwherekch=@kch) select*fromskbwherekch=@kch else print’无此课程授课信息’ end 5) 课程成绩分布统计。存储过程名称TJ_CJ。参数:课程号(@kch)。实现功能:把成绩表(CJB)中指定课程按照分数段人数进行统计,放入统计表(TJB)中。 编写思路:(1)清空TJB表,插入一行所有分数段的人数都为0的所要查找的课程的记录.(2)判断所查的课程号在CJB表中是否有记录,若有则查找出各个分数段的人数并且更新到TJB表中。 方法一: createPROCEDURE[dbo].[TJ_CJ](@kchchar(3)) as truncatetableTJB insertintoTJBvalues(@kch,0,0,0,0,0) ifexists(select*fromCJBwhereKCH=@kch) begin updateTJBsetRS1=(selectcount(*)fromCJBwhereCJ>=0 andCJ〈60 andKCH=@kch) updateTJBsetRS2=(selectcount(*)fromCJBwhereCJ>=60 andCJ<70 andKCH=@kch) updateTJBsetRS3=(selectcount(*)fromCJBwhereCJ〉=70 andCJ〈80 andKCH=@kch) updateTJBsetRS4=(selectcount(*)fromCJBwhereCJ>=80 andCJ〈90 andKCH=@kch) updateTJBsetRS5=(selectcount(*)fromCJBwhereCJ>=90 andCJ<=100 andKCH=@kch) end execTJ_CJ'101' 方法二: 如果选择统计的课程在成绩表(CJB)已经存在,可以采用下列代码完成统计功能,并且代码效率较高。但CJB表中没有所选择的课程记录,执行的结果是各个分数段的人数为null。 createprocedure[dbo]。[TJ_CJ](@KCHvarchar(3)) as begin deletefromTJB insertintoTJB(KCH,RS1,RS2,RS3,RS4,RS5) select@KCH, sum(casewhenCJ< 60 then 1 else 0 end), sum(casewhenCJ>= 60 andCJ〈= 69 then 1 else 0 end), sum(casewhenCJ>= 70 andCJ〈= 79 then 1 else 0 end), sum(casewhenCJ>= 80 andCJ〈= 89 then 1 else 0 end), sum(casewhenCJ〉= 90 andCJ<= 100 then 1 else 0 end) fromCJBwhereKCH=@KCH end (6) 触发器 1) 实现yhb(yhbh)—xsb(xh)和jsb(jsbh)参照关系–必须用触发器实现 (把sql语句贴在下面) createtriggert2onyhb forinsert as begin ifnotexists(select*fromxsbwherexh=(selectyhbhfrominserted)) begin ifnotexists(select*fromjsbwherejsbh=(selectyhbhfrominserted)) begin print'插入的编号出错!’ rollbacktransaction end end end 2) 实现更新学生信息和老师信息的时候用户表中的信息可以实现级联修改. (把sql语句贴在下面) createtriggerxsb_tiggeronxsb forupdate as ifupdate(xh) begin declare@new_numvarchar(6),@old_numvarchar(6) select@new_num=xhfrominserted select@old_num=xhfromdeleted updateyhb setyhbh=@new_num whereyhbh=@old_num end createtriggerjsb_tiggeronjsbforupdate as ifupdate(jsbh) begin declare@new_numvarchar(6),@old_numvarchar(6) select@new_num=jsbhfrominserted select@old_num=jsbhfromdeleted updateyhb setyhbh=@new_num whereyhbh=@old_num end 3) 当删除学生信息的时候选课记录同时删除,同时用户表的记录也删除。 (把sql语句贴在下面) createtriggerxsb_d1onxsb fordelete as begin declare@xhvarchar(6) select@xh=xhfromdeleted deletefromcjbwherexh=@xh deletefromyhbwhereyhbh=@xh end 4) 当删除老师信息的时候授课记录也同时删除,同时用户表中的记录也删除。 (把sql语句贴在下面) createtriggerjsb_deletiggeronjsb fordelete as begin declare@jsbhvarchar(6) select@jsbh=jsbhfromdeleted deletefromskbwherejsbh=@jsbh deletefromyhbwhereyhbh=@jsbh end 5) 增加成绩时成绩大于60应该给学生总学分加上这门课的学分.删除成绩的时候,如果成绩小于60分,应该把学生的总学分去掉这门课的学分。 (把sql语句贴在下面) createtriggercjb_insetiggeroncjbforinsert as begin declare@xhvarchar(6) declare@cjint declare@xfint declare@kchchar(3) select@xh=xh,@cj=cj,@kch=kchfrominserted select@xf=xffromkcbwherekch=@kch if(@cj〉=60) begin updatexsb setzxf=zxf+@xf wherexh=@xh end end createtriggercjb_deletiggeroncjbfordelete as begin declare@xhvarchar(6) declare@cjint declare@xfint declare@kchchar(3) select@xh=xh,@cj=cj,@kch=kchfromdeleted select@xf=xffromkcbwherekch=@kch if(@cj>=60) begin updatexsb setzxf=zxf-@xf wherexh=@xh end end 6)通过instead of触发器实现对学生选课情况视图(学号,姓名,课程号,课程名,成绩,学分,总学分,教师)的插入数据操作、更新数据操作、删除数据操作. (把sql语句贴在下面) createviewv1 as selectcjb。xh,xm,xsb.bj,cjb.kch,kcm,CJ,xf,zxf,jsb。jsbh,jsxm fromXSB,KCB,CJB,jsb,skb wherexsb。XH=CJB.XHandkcb。KCH=cjb。KCHandjsb.jsbh=skb。jsbhandskb。kch=CJB.KCH createtriggerv1_t –有问题,待完善 onv1 insteadofinsert as begin declare@xhchar(6),@xmchar(8),@kchchar(3),@kcmchar(16),@cjint,@jsbhchar(6),@jsxmchar(8),@bjvarchar(50) set@xh=(selectxhfrominserted) set@xm=(selectXMfrominserted) set@kch=(selectkchfrominserted) set@kcm=(selectkcmfrominserted) set@cj=(selectCJfrominserted) set@jsbh=(selectjsbhfrominserted) set@jsxm=(selectjsxmfrominserted) set@bj=(selectbjfrominserted) ifnotexists(select*fromXSBwherexh=@xh) begin insertintoXSB(XH,XM,bj) values(@xh,@xm,@bj) end ifnotexists(select*fromKCBwhereKCH=@kch) begin insertintoKCB(KCH,KCM) values(@kch,@kcm) end ifnotexists(select*fromCJBwhereXH=@xhandKCH=@kch) begin insertintoCJB(XH,KCH,CJ) values(@xh,@kch,@cj) end ifnotexists(select*fromjsbwherejsbh=@jsbh) begin insertintojsb(jsbh,jsxm) values(@jsbh,@jsxm) end ifnotexists(select*fromskbwherejsbh=@jsbhandkch=@kchandbj=@bj) begin insertintoskb(jsbh,kch,bj) values(@jsbh,@kch,@bj) end End 6、运行与维护 用java和sql server 2008把系统功能实现.
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传
相似文档                                   自信AI助手自信AI助手

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服