3 逻辑结构设计
3.1逻辑结构简介
逻辑结构设计就是把概念结构设计阶段设计好的基本E-R图转换为与选用DBMS产品所支持的数据模型相符合的逻辑结构。 设计逻辑结构一般分为3步进行:
(1) 将概念结构转换为一般的关系、网状、层次模型;
(2) 将转换来的关系、网状、层次模型向特定DBMS支持下的数据模型转换; (3) 对数据模型进行优化。
3.2 E-R图向关系模型的转换
将E-R图转换为关系模型实际上就是要将实体型、实体的属性和实体型间的联系转换为关系模式,这种转换一般遵循如下原则:一个实体型转换为一个关系模式。实体的属性就是关系的属性,实体的码就是关系的码。 对于实体间的联系则有以下不同的情况:
(1)一个1:1联系可以转换为一个独立的关系模式,也可以与任意一断对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的试题的码以及联系本身的属性均转换为关系的属性,每个实体的码均为该关系的候选码。如果与某一端实体对应的关系模式合并,则需要在该关系模式的属性中加入另一个关系模式的码和联系本身的属性。
(2)一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。如果转换为一个独立的关系模式,则与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性,而关系的码为n端实体的码。
(3)一个m:n联系转换为一个关系模式。与该联系相连的饿个实体的码以及联系本身的属性均转换为关系的属性,个实体的码组成关系的码或关系码的一部分。
(4)3个或3个以上实体间的一个多元联系可以转换为一个关系模式。与该多元联系相连的各实体的码以及联系本身的属性均转换为关系的属性,各实体的码组成关系的码或关系码的一部分。
(5)具有相同码的关系模式可合并。
8
4物理模型设计
数据库物理设计是将逻辑设计影射到存储介质上,利用可用的硬件和软件功能尽可能快地对数据进行物理访问和维护。
4.1定义数据库
SQL Server 2008数据库文件分为3中类型:主数据文件、次数据文件和日志文件。 通过SQL语言进行数据库创建,创建数据库的语句如下: Create database 人事管理系统;
4.2 创建存储过程 4.2.1
在员工基本信息表,家庭信息表,学历信息表,职称评定表,创建一个插入员工信息的存储过程:
create procedure insertworker
@Worker_no varchar(15) ,--工号 @Worker_name varchar(8) ,--姓名 @Sex varchar(2) ,--性别
@Birthday date ,--出生年月 @ID varchar(18) ,--身份证号 @Department_name varchar(15) ,--部门 @post varchar(8) ,--职位 @phone varchar(11) ,--电话
@work_date date ,--工作时间 @Worker_type varchar(8) , --员工类型
@Degree_no varchar(15) , --学位号 @Degree varchar(4) ,--学位 @Major varchar(25) ,--专业 @School varchar(25) ,--毕业学校 @Gradute_date date , --毕业时间
@Home_no varchar(15) ,--家庭编号 @Marriage_info varchar(4) ,--婚姻状况 @Home_number smallint ,--家庭人口 @Home_phone varchar(11) ,--家庭电话 @Home_address varchar(50) ,--家庭地址
@Pro_no varchar(15) ,--职称编号 @Assess_date date ,--评定日期 @Assess_unit varchar(20) ,--评定单位 @Assess_title varchar(8) ,--评定职称 @Remark varchar(200) --备注
9
as
--插入员工信息 insert into
worker_info(Worker_no,Worker_name,Sex,Birthday,age,ID,Department_name,post,phone,work_date,Worker_type) values
(@Worker_no,@Worker_name,@Sex,@Birthday,FLOOR(datediff(DY,@Birthday,getdate())/365.25),@ID,@Department_name,@post,@phone,@work_date,@Worker_type) --插入职称信息 insert into
Pro_info(Pro_no,Worker_no,Assess_date,Assess_unit,Assess_title,Remark) values (@Pro_no,@Worker_no,@Assess_date,@Assess_unit,@Assess_title,@Remark) --插入家庭信息 insert into
home_info(Home_no,worker_no,Marriage_info,Home_number,Home_phone,Home_address) values
(@Home_no,@worker_no,@Marriage_info,@Home_number,@Home_phone,@Home_address) --插入学历信息 insert into
degree_info(Degree_no,Worker_no,Degree,Major,School,Gradute_date) values (@Degree_no,@Worker_no,@Degree,@Major,@School,@Gradute_date)
4.2.2
在部门基本信息表中创建插入部门信息的存储过程:
create procedure add_department
@Department_no varchar(15) , @Department_name varchar(15) , @Manager_no varchar(15) , @Workeload float(2) , @Real_number smallint , @Need_number smallint as
insert into
department_info(Department_no,Department_name,Manager_no,Workeload,Real_number,Need_number) values
(@Department_no,@Department_name,@Manager_no,@Workeload,@Real_number,@Need_number)
4.2.3
在部门基本信息表中创建更新部门信息的存储过程: create procedure update_department @Department_name varchar(15) ,
10
@Manager_no varchar(15) , @Workeload float(2) , @Need_number smallint as
update department_info
set Manager_no=@Manager_no, Workeload=@Workeload, Need_number=@Need_number
where Department_name=@Department_name;
4.2.4
创建当一个员工辞职时删除该信息,当一个员工退休时,将基本信息复制到退休表中,其他信息删除的存储过程
CREATE PROCEDURE worker_type @worker_no varchar(15), @worker_type varchar(4) AS BEGIN
SET NOCOUNT ON;
IF @worker_type='辞职' BEGIN
delete from worker_info where worker_no=@worker_no END
IF @worker_type='退休' BEGIN
INSERT INTO
tui_info(Worker_no,Worker_name,Sex,Birthday,Age,ID,Department_name,Post,Phone,Work_date,Tui_date) SELECT
Worker_no,Worker_name,Sex,Birthday,FLOOR(datediff(DY,Birthday,getdate())/365.25),ID,Department_name,Post,Phone,Work_date,GETDATE() FROM worker_info WHERE Worker_no=@Worker_no;
DELETE FROM worker_info WHERE Worker_no=@Worker_no; END END
4.2.5
创建更新家庭信息表、学历信息、职称信息的存储过程 create procedure update_home
@Worker_no varchar(15) ,--工号 @Marriage_info varchar(4) ,--婚姻状况 @Home_number smallint ,--家庭人口 @Home_phone varchar(11) ,--家庭电话 @Home_address varchar(50) --家庭地址
11
as
update home_info
set Marriage_info=@Marriage_info, Home_number=@Home_number, Home_phone=@Home_phone, Home_address=@Home_address where Worker_no=@Worker_no;
--更新学历信息
create procedure update_degree
@Worker_no varchar(15) ,--工号 @Degree varchar(4) ,--学位 @Major varchar(25) ,--专业 @School varchar(25) ,--毕业学校 @Gradute_date date --毕业时间 as
update degree_info set Degree=@Degree, Major=@Major, School=@School,
Gradute_date=@Gradute_date where Worker_no=@Worker_no;
--更新职称信息
create procedure update_pro
@Worker_no varchar(15) ,--工号 @Assess_date date ,--评定日期 @Assess_unit varchar(20) ,--评定单位 @Assess_title varchar(8) --评定职称 as
update pro_info
set Assess_date=@Assess_date, Assess_unit=@Assess_unit, Assess_title=@Assess_title where Worker_no=@Worker_no;
4.2.6
创建某部门平均年龄的存储过程
create procedure avg_age
@Department_name varchar(15) as
select AVG(Age)
from worker_info where Department_name=@Department_name
4.2.7
12