数 据 库 原 理课设.docx
《数 据 库 原 理课设.docx》由会员分享,可在线阅读,更多相关《数 据 库 原 理课设.docx(14页珍藏版)》请在冰点文库上搜索。
![数 据 库 原 理课设.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/55a71ad0-0110-4121-8ef9-d82daf3d5877/55a71ad0-0110-4121-8ef9-d82daf3d58771.gif)
数据库原理课设
数据库原理
课程设计任务书
班级:
计软11—2
学号:
1106120203
姓名:
杜素玉
成绩:
电子与信息工程学院
计算机科学系
7数据库原理课程设计报告
7.1设计题目名称
学校人力资源管理系统
7.2系统概述
系统功能:
实现学校部门信息和教职工信息管理;
实现教师的工资管理;
实现教师的奖惩信息管理;
创建存储过程根据提交的部门编号,查看该部门的部长;
创建存储过程根据提交员工编号和工资发放时间,查看该员工的薪资信息
创建存储过程根据员工提交的员工编号和奖罚时间,查看该员工的奖罚信息
创建触发器当增加、删除教职工和修改教职工部门信息时自动修改相应部门的职工人数;
建立数据库相关表之间的参照完整性约束。
7.3系统功能模块设计
说明:
学校人力资源管理系统包含部门管理、员工管理、工资管理、奖惩管理。
其中,部门管理包含部门名称、人数等;员工管理包含员工学历、家庭关系等;工资管理包含基本工资、实发工资等;奖惩管理包含编号、原因等。
7.4数据库概念结构设计
在需求分析阶段所得到的应用需求应该首先抽象为信息世界的结构,才能更好地、更准确地用某一DBMS实现这些需求。
概念结构的主要特点是:
1.能真实、充分地反应现实世界,包括事物和事物之间的联系,能满足用户对数据的处理要求,是对现实世界的一个真实模型;
2.易于理解,从而可以用它和不熟悉计算机的用户交换意见,用户的积极参与是数据库设计成功的关键;
3.易于更改,当应用环境和应用要求改变时,容易对概念模型修改和扩充;
4.易于向关系、网状、层次等各种数据模型转换。
概念结构是各种数据模型的共同基础,它比数据模型更独立于机器、更抽象,从而更加稳定。
描述概念模型的有力工具是E-R模型。
E-R图:
7.5数据库逻辑结构设计
逻辑结构设计:
下面将E-R图转换为关系模型:
员工信息(员工编号,员工姓名,年龄,性别,出生年月,婚姻状态,政治面貌,学历,部门编号,职务,联系方式,备注)主键:
员工编号;外码:
部门编号;
部门信息(部门编号,部门名称,部门人数)主键:
部门编号;
奖惩信息(奖惩编号,员工编号,奖罚时间,奖罚原因,奖罚地点,备注)主键:
奖惩编号,外码:
员工编号;
薪资信息(薪资编号,员工编号,基本工资,福利,奖金,计算方法,实发工资,发放日期),主键:
薪资编号;外码:
员工编号。
员工工资(薪资编号,员工编号)主键:
员工编号,薪资编号
员工部门(员工编号,部门编号)主键:
员工编号,薪资编号
员工惩罚(员工编号,奖惩编号)主键:
员工编号,奖惩编号
7.6数据库物理设计
员工信息表
字段名
字段类型
小数位数
是否主键
是否为空
是否外键
备注
列名
数据类型
是
否
员工编号
int
否
员工姓名
varchar
否
年龄
int
否
性别
varchar
否
出生年月
Datetime
否
婚姻状态
varchar
否
政治面貌
varchar
否
学历
varchar
否
部门编号
int
否
是
职务
varchar
否
联系方式
varchar
否
备注
varchar
部门信息表
字段名
字段类型
小数位数
是否主键
是否为空
是否外键
备注
部门编号
int
是
否
部门名称
varchar
否
部门人数
int
否
薪资信息表
字段名
字段类型
小数位数
是否主键
是否为空
是否外键
备注
薪资编号
int
是
否
员工编号
int
否
是
基本工资
int
否
福利
int
否
奖金
int
否
计算方法
int
否
实发工资
int
否
发放日期
int
否
奖惩信息表
字段名
字段类型
小数位数
是否主键
是否为空
是否外键
备注
奖惩编号
Int
是
否
员工编号
Int
否
是
奖罚原因
Varchar
否
奖罚地点
Varchar
否
奖罚时间
Datetime
否
备注
varchar
1.视图
视图是一个虚拟表,其内容由查询定义。
同真实的表一样,视图包含一系列带有名称的列和行数据。
但是,视图并不在数据库中以存储的数据值集形式存在。
行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
对其中所引用的基础表来说,视图的作用类似于筛选。
定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。
分布式查询也可用于定义使用多个异类源数据的视图。
2.存储过程
存储过程就是将常用的或很复杂的工作,预先用SQL语句写好并用一个指定的名称存储起来,那么以后要叫数据库提供与已定义好的存储过程的功能相同的服务时,只需调用execute,即可自动完成命令。
存储过程的优点:
(1).存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度。
(2).当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。
(3).存储过程可以重复使用,可减少数据库开发人员的工作量
(4).安全性高,可设定只有某此用户才具有对指定存储过程的使用权。
3.触发器
触发器是一种特殊类型的存储过程,它不同于我们前面介绍过的存储过程。
触发器主要是通过事件进行触发而被执行的,而存储过程可以通过存储过程名字而被直接调用。
当对某一表进行诸如Update、Insert、Delete这些操作时,SQLServer就会自动执行触发器所定义的SQL语句,从而确保对数据的处理必须符合由这些SQL语句所定义的规则。
触发器的主要作用就是其能够实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
除此之外,触发器还有其它许多不同的功能:
(1)强化约束(Enforcerestriction)
触发器能够实现比CHECK语句更为复杂的约束。
(2)跟踪变化Auditingchanges
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
(3)级联运行(Cascadedoperation)。
触发器可以侦测数据库内的操作,并自动地级联影响整个数据库的各项内容。
例如,某个表上的触发器中包含有对另外一个表的数据操作(如删除,更新,插入)而该操作又导致该表上触发器被触发。
(4)存储过程的调用(Storedprocedureinvocation)。
在物理结构中,数据的基本存取单位是存储记录。
有了逻辑结构以后,就可以设计存储记录结构,一个存储记录可以与多个逻辑记录相对应。
存储记录就包括记录的组成,数据项的类型和长度等。
7.7程序运行环境和开发环境
运行环境:
操作系统:
windows7
运行软件:
SQL
开发环境:
操作系统:
windows7
开发软件:
SQL
7.8主要模块程序流程图
7.9主要功能实现的程序段
1、创建高校教职工管理数据库:
CREATEDATABASE高校教职工管理
ON
(NAME=高校教职工管理DAT,
FILENAME='D:
\SQL\高校教职工管理DAT.MDF',
SIZE=5,
MAXSIZE=20,
FILEGROWTH=2
)
LOGON
(NAME=高校教职工管理LOG,
FILENAME='D:
\SQL\高校教职工管理LOG.LDF',
SIZE=5,
MAXSIZE=20,
FILEGROWTH=2
)
--------------------------------------------------------
2、创建表
CREATETABLE部门信息表
(
部门编号INTPRIMARYKEY,
部门名称VARCHAR(20)UNIQUENOTNULL,
部门人数INTCHECK(部门人数>=0)NOTNULL,
)
-------------------------------------------
CREATETABLE员工信息表
(
员工编号INTNOTNULLPRIMARYKEY,
员工姓名VARCHAR(20)NOTNULL,
年龄INTCHECK(年龄>=1)NOTNULL,
性别VARCHAR
(2)CHECK(性别IN('男','女'))NOTNULL,
出生年月DatetimeNOTNULL,
婚姻状态VARCHAR(4)CHECK(婚姻状态IN('已婚','未婚'))NOTNULL,
政治面貌VARCHAR(20)CHECK(政治面貌IN('清白','团员','党员'))NOTNULL,
学历VARCHAR(20)NOTNULL,
部门编号INTNOTNULL,
职务VARCHAR(20)NOTNULL,
联系方式VARCHAR(11)UNIQUENOTNULL,
备注VARCHAR(500),
FOREIGNKEY(部门编号)REFERENCES部门信息表(部门编号)
)
---------------------------------------------------------
CREATETABLE薪资信息表
(
薪资编号INTPRIMARYKEY,
员工编号INTNOTNULL,
基本工资INTCHECK(基本工资>=0)NOTNULL,
福利INTCHECK(福利>=0)NOTNULL,
奖金INTCHECK(奖金>=0)NOTNULL,
计算方法VARCHAR(50)NOTNULL,
实发工资INTCHECK(实发工资>=0),
发放日期DatetimeNOTNULL,
FOREIGNKEY(员工编号)REFERENCES员工信息表(员工编号)
)
----------------------------------------------------------
CREATETABLE奖惩信息表
(
奖惩编号INTPRIMARYKEY,
员工编号INTNOTNULL,
奖罚时间DatetimeNOTNULL,
奖罚原因VARCHAR(100)NOTNULL,
奖罚地点VARCHAR(20)NOTNULL,
备注VARCHAR(500),
FOREIGNKEY(员工编号)REFERENCES员工信息表(员工编号)
)
---------------------------------------------------------------
3、创建视图:
--视图员工基本信息:
CREATEVIEW员工基本信息(员工姓名,部门名称,职务,联系方式,薪资)
ASSELECT员工姓名,部门名称,职务,联系方式,实发工资
FROM员工信息表,部门信息表,薪资信息表
WHERE员工信息表.部门编号=部门信息表.部门编号
AND员工信息表.员工编号=薪资信息表.员工编号
-----------------------------------------------------
--视图:
各部门部长信息
CREATEVIEW部门部长信息(部门编号,部门名称,员工编号,员工名字)
ASSELECT部门信息表.部门编号,部门名称,员工编号,员工姓名
FROM员工信息表,部门信息表
WHERE员工信息表.部门编号=部门信息表.部门编号
AND员工信息表.职务='部长'
--------------------------------------------------------------
4、创建存储过程
--存储过程LOOKWAGE:
根据员工提交的员工编号和工资发放时间,查看该员工的薪资信息,
--包括员工编号,姓名,实发薪资,和发放日期。
CREATEPROCEDURELOOKWAGE
@IDINT,@TIMEDatetime
AS
SELECT员工信息表.员工编号,员工姓名,实发工资,发放日期
FROM员工信息表,薪资信息表
WHERE员工信息表.员工编号=薪资信息表.员工编号
AND员工信息表.员工编号=@IDAND发放日期=@TIME
--存储过程LOOKREWARDS:
根据员工提交的员工编号和奖罚时间,查看该员工的奖罚信息,
--包括员工编号,姓名,奖罚原因,奖罚时间。
CREATEPROCEDURELOOKREWARDS
@IDINT,@TIMEDatetime
AS
SELECT员工信息表.员工编号,员工姓名,奖罚原因,奖罚时间
FROM员工信息表,奖罚信息表
WHERE员工信息表.员工编号=奖罚信息表.员工编号
AND员工信息表.员工编号=@IDAND发放日期=@TIME
---------------------------------------------------------------------
--存储过程Find_Minister:
根据提交的部门编号,查看该部门的部长
CREATEPROCEDUREFind_Minister
@IDINT
AS
SELECT部门信息表.部门编号,部门信息表.部门名称,员工信息表.员工编号,员工姓名
FROM员工信息表,部门信息表
WHERE员工信息表.部门编号=部门信息表.部门编号
AND员工信息表.职务='部长'
-------------------------------------------------------------------
--5、创建触发器
--触发器workerid:
要求员工信息表中的员工编号被修改时,薪资信息表
--奖惩信息表中的员工编号也被修改。
CREATETRIGGERWORKERIDON员工信息表
FORUPDATE
AS
BEGIN
IF(UPDATE(员工编号))
BEGIN
UPDATE薪资信息表
SET薪资信息表.员工编号=(SELECT员工编号FROMinserted)
WHERE薪资信息表.员工编号=(SELECT员工编号FROMdeleted)
UPDATE奖惩信息表
SET奖惩信息表.员工编号=(SELECT员工编号FROMinserted)
WHERE奖惩信息表.员工编号=(SELECT员工编号FROMdeleted)
END
END
------------------------------------------------------------------
--触发器CHECK_EXIST:
--向员工信息表插入一条记录时,检查该记录的部门信息在部门信息表
--是否存在,若不存在则不允许插入。
CREATETRIGGERCHECK_EXIST
ON员工信息表
FORINSERT
AS
IFEXISTS(SELECT*FROMinserteda
WHEREa.部门编号NOTIN(SELECT部门信息表.部门编号FROM部门信息表))
BEGIN
RAISERROR('该部门不存在!
!
',16,1)
ROLLBACKTRANSACTION--撤销刚才的操作,恢复到原来的状态
END
---------------------------------------------------------------------
--触发器COUNT_STAFF
--向员工信息表插入一条记录时,该员工所在的部门人数加.
CREATETRIGGERCOUNT_STAFF
ON员工信息表
AFTERINSERT
AS
BEGIN
UPDATE部门信息表
SET部门人数=部门人数+1
WHERE部门编号IN(SELECT部门编号FROMinserted)
END
------------------------------------------------------------
--触发器departid:
要求部门信息中的部门编号被修改时,员工信息表中员工
--所属部门编号也被修改。
CREATETRIGGERdepartidON部门信息表
FORUPDATE
AS
BEGIN
IF(UPDATE(部门编号))
UPDATE员工信息表
SET员工信息表.部门编号=(SELECT部门编号FROMinserted)
WHERE员工信息表.部门编号=(SELECT部门编号FROMinserted)
END
---------------------------------------------------------------
--触发器CHECK_DELETE:
删除员工记录时,该员工所在部门人数减.
CREATETRIGGERCHECK_DELETE
ON员工信息表
FORDELETE
AS
BEGIN
UPDATE部门信息表
SET部门人数=部门人数-1
WHERE部门编号IN(SELECT部门编号FROMinserted)
END