通讯录系统数据库设计
第一篇:通讯录系统数据库设计
学校通讯录管理系统数据库设计
4.2 数据库设计
在本实例中使用的是SQL Server 2000数据库管理系统。数据库服务器安装的位置为本机,数据库名称为communicationserver。下面将介绍数据库分析和设计、数据表的创建、数据表关系图和创建存储过程的内容。
4.2.1 数据库分析和设计
在本节中,将根据上一节系统功能的设计分析创建各数据表的实体E-R关系图,它是数据库设计非常重要的一步,下面用E-R图的形式表示出各实体的属性。
1. 用户E-R实体图
用户的实体具有用户ID、密码、姓名、性别、电话、E-mail、用户权限7个属性,ER图如图4-5所示。
姓名用户权限性别电话用户E-mail用户ID图4-5 用户E-R实体图
密码 2. 地区E-R实体图
地区的实体具有地区编号、地区名称2个属性,E-R图如图4-6所示。
地区编号地区图4-6 地区E-R实体图
地区名称 3. 职务E-R实体图
职务的实体具有职务编号、职务名称2个属性,E-R图如图4-7所示。
职务编号职务图4-7 职务E-R实体图
职务名称 4. 学校E-R实体图
学校的实体具有学校名称、学校所在地区、在校学生人数3个属性,可用E-R图表示,如图4-8所示。
学校名称学校在校学生人数学校编号学校所在地区
图4-8 学校E-R实体图
5. 通讯录E-R实体图
通讯录的实体具有联系人姓名、地址、联系电话、所属职务、所在学校、所在单位、所属地区7个属性,E-R图如图4-9所示。
联系人姓名联系电话所在单位通讯录所在学校图4-9 通讯录E-R实体图
所属地区地址所属职务
4.2.2 数据表的创建
在上面一节中讲解了实体的E-R图,本节中将根据E-R图的内容,创建企业信息管理系统中的各数据表,在此系统中共涉及到5个数据表的应用,分别为如下。
1、字段采用camel 风格定义
2、用不同颜色区分字段 主键:蓝色 外键:白色
既是主键又是外键:淡蓝色 普通字段:青绿 1. 用户信息表
用户信息表(Users)用于存放校园通讯录信息管理系统中所有系统管理用户的信息,用户管理是每个管理系统中必不可少的,也是比较重要的一部分,本系统中进行了较详细的设计,表中各个字段的数据类型、大小以及简短描述如表4-1所示。
表4-1 用户信息表 TB_Users 字段名称 sUserID sUserName sUserPassword sUserSex sUserEmail sUserPhone sUserPurview 2.地区信息表
地区信息表(Client)用于存放校园通讯录信息管理系统中所有地区的信息,地区信息的管理是系统中比较重要的内容,地区的名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-2所示。
表4-2 地区信息表
TB_Area 字段名称 sAreaID sAreaName 3. 职务信息表
职务信息表(Compact)用于存放校园通讯录信息管理系统中所有职务的信息,职务信息的管理是系统中比较重要的内容,职务的名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-3所示。
表4-3 职务信息表
TB_Duty
字段名称 sDutyID sDutyName
字段类型 varchar(20) varchar(50)
字段描述 职务编号[PK] 职务名称
字段类型 varchar(20) varchar(50)
字段描述 地区编号[PK] 地区名称
字段类型 varchar(10) varchar (20) varchar(10) char(2) varchar(20) varchar(20) char(1)
字段描述 用户ID [PK] 用户姓名
记录用户登入本系统时的用户密码
用户性别 用户E-mail 用户的联系电话 用户权限 4. 学校信息表
学校信息表(Com_detail)用于存放校园通讯录信息管理系统中所有学校的信息,学校信息的管理是系统中比较重要的内容,学校名称是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-4所示。
表4-4 学校信息表
TB_School 字段名称 sSchoolID sSchoolName iStudentNum sAreaID_FK 5. 通讯录信息表
通讯录信息表(product)用于存放校园通讯录信息管理系统中所有通讯录的信息,通讯录信息的管理是系统中比较重要的内容,联系电话是其中的关键信息,表中各个字段的数据类型、大小以及简短描述如表4-5所示。
表4-5 通讯录信息表
TB_AddrList
字段类型 varchar(20) varchar(50) int varchar(20)
字段描述 学校编号[PK] 学校名称 学校人数 地区编号[FK] 字段名称 iAddrID sLinkName sAddress sLinkPhone sUnitName sSchoolID_FK sDutyID_FK sAreaID_FK
字段类型 int varchar(50) varchar(20) varchar(20) varchar(50) varchar(20) varchar(20) varchar(20)
字段描述
通讯录编号(自动编号)[PK] 联系人姓名 地址 联系电话 工作单位 学校编号[FK] 职务编号[FK] 地区编号[PK] 4.2.3 创建视图
学校信息视图表V_SchoolInfo 字段名称 sSchoolName sAreaName
字段类型 varchar(50) varchar(50)
字段描述 学校名称 地区名称 sLinkName sDutyName sLinkPhone
create view V_SchoolInfo as
varchar(20) varchar(20) varchar(20)
联系人姓名 职务名称 联系电话
select sSchoolName,sAreaName,sLinkName,sDutyName,sLinkPhone from TB_AddrList,TB_School,TB_Duty,TB_Area where TB_AddrList.sSchoolID_FK=TB_School.sSchoolID
and and TB_AddrList.sDutyID_FK=TB_Duty.sDutyID TB_AddrList.sAreaID_FK=TB_Area.sAreaID 4.2.4 数据表关系图
在学校通讯录信息管理系统中各数据表的关系图,如图4-10所示。在TB_School数据表中,TB_Area数据表的sDutyID_FK字段作为外键。在TB_AddrList数据表中,TB_School数据表的sSchoolID_FK字段、TB_Area数据表中的sAreaID_FK字段和TB_Duty数据表中的sDutyID_FK字段作为外键。
图4-10 数据表关系图 4.2.5 创建存储过程
因为使用存储过程可以给系统带来优化,所以系统将很大程度地使用存储过程,在系统中共应用了10个存储过程,以Add开头的存储过程为系统中信息添加的存储过程,以Update开头的存储过程为系统中信息修改的存储过程,这些存储过程将会在系统程序文件的后台应用中调用,下面将对系统中应用的存储过程进行解释。
1. AddTB _Users存储过程
AddTB _Users存储过程用于向用户信息表中添加新的用户信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_Users @sUserID varchar(10), @sUserName varchar(20), @sUserPassword varchar(10), @sUserSex char(2), @sUserEmail varchar(20), @sUserPhone varchar(20), @sUserPurview char(1) AS
INSERT INTO TB_Users ( sUserID, sUserName, sUserPassword, sUserSex, sUserEmail, sUserPhone,
sUserPurview )
VALUES ( @sUserID, @sUserName, @sUserPassword, @sUserSex, @sUserEmail, @sUserPhone, @sUserPurview ) GO 2. Add 存储过程 Add TB_Area存储过程用于往地区信息表中添加新的地区信息。以下代码表示了这一存储过程。
CREATE PROCEDURE AddTB_Area
@sAreaID varchar(20),
@sAreaName varchar(50) AS
INSERT INTO TB_Area (
sAreaID,
sAreaName )
VALUES (
@sAreaID,
@sAreaName ) GO 3. AddTB_Duty存储过程
AddTB_Duty存储过程用于往职务信息表中添加新的职务信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_Duty
@sDutyID varchar(20),
@sDutyName varchar(50) AS
INSERT INTO TB_Duty (
sDutyID,
sDutyName )
VALUES (
@sDutyID,
@sDutyName ) GO 4.AddTB_School存储过程
AddTB_School 该存储过程用于往学校信息表中添加新的学校信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_School
@sSchoolID varchar(20),
@sSchoolName varchar(50),
@iStudentNum int,
@sAreaID_FK varchar(20) AS
INSERT INTO TB_School (
sSchoolID,
sSchoolName,
iStudentNum,
sAreaID_FK )
VALUES (
@sSchoolID,
@sSchoolName,
@iStudentNum,
@sAreaID_FK ) GO 5. AddTB_AddrList存储过程
AddTB_AddrList存储过程用于往通讯录信息表中添加新的通讯录信息。以下代码表示了这一存储过程。 CREATE PROCEDURE AddTB_AddrList
@sLinkName varchar(20),
@sAddress varchar(50),
@sLinkPhone varchar(20),
@sUnitName varchar(20),
@sSchoolID_FK varchar(20),
@sDutyID_FK varchar(20) AS
INSERT INTO TB_AddrList (
sLinkName,
sAddress,
sLinkPhone,
sUnitName,
sSchoolID_FK,
sDutyID_FK )
VALUES (
@sLinkName,
@sAddress,
@sLinkPhone,
@sUnitName,
@sSchoolID_FK,
@sDutyID_FK ) GO 6. UpdateTB _Users存储过程
UpdateTB _Users存储过程用于修改用户信息表中,符合条件的用户信息,其中密码信息不可以更新。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_Users
@sUserID varchar(10),
@sUserName varchar(20),
@sUserSex char(2),
@sUserEmail varchar(20),
@sUserPhone varchar(20),
@sUserPurview char(1) AS
UPDATE TB_Users SET
sUserID =@sUserID,
sUserName =@sUserName,
sUserSex=@sUserSex,
sUserEmail=@sUserEmail,
sUserPhone=@sUserPhone,
sUserPurview=@sUserPurview WHERE
sUserID =@sUserID GO 7. UpdateTB_Area存储过程
UpdateTB_Area存储过程用于修改地区信息表中的地区信息。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_Area
@sAreaID varchar(20),
@sAreaName varchar(50) AS
UPDATE TB_Area SET
sAreaID =@sAreaID,
sAreaName =@sAreaName WHERE
sAreaID =@sAreaID GO 8. UpdateTB_Duty存储过程
UpdateTB_Duty存储过程用于修改职务信息表中的职务信息。以下代码表示了这一存储过程。
CREATE PROCEDURE UpdateTB_Duty
@sDutyID varchar(20),
@sDutyName varchar(50) AS
UPDATE TB_Duty SET
sDutyID =@sDutyID,
sDutyName =@sDutyName WHERE
sDutyID =@sDutyID GO 9. UpdateTB_School存储过程
UpdateTB_School存储过程用于修改学校信息表中的学校信息。以下代码表示了这一存储过程。 CREATE PROCEDURE UpdateTB_School
@sSchoolID varchar(20),
@sSchoolName varchar(50),
@iStudentNum int,
@sAreaID_FK varchar(20) AS
UPDATE TB_School SET
sSchoolID =@sSchoolID,
sSchoolName =@sSchoolName,
iStudentNum =@iStudentNum,
sAreaID_FK=@sAreaID_FK WHERE
sSchoolID =@sSchoolID GO 10. UpdateTB_AddrList存储过程
UpdateTB_AddrList存储过程用于修改通讯录信息表中的通讯录信息。以下代码表示了这一存储过程。
CREATE PROCEDURE UpdateTB_AddrList
@iAddrID int,
@sLinkName varchar(20),
@sAddress varchar(50),
@sLinkPhone varchar(20),
@sUnitName varchar(20),
@sSchoolID_FK varchar(20),
@sDutyID_FK varchar(20) AS
UPDATE TB_AddrList SET
sLinkName =@sLinkName,
sAddress =@sAddress,
sLinkPhone =@sLinkPhone,
sUnitName=@sUnitName,
sSchoolID_FK=@sSchoolID_FK,
sDutyID_FK=@sDutyID_FK WHERE
iAddrID =@iAddrID GO
第二篇:C语言课程设计学生通讯录管理系统设计
一、题目内容的描述
学生通讯录管理系统设计
设计一个学生通信录,学生通迅录数据信息构成内容可自行设计(如:姓名、家庭地址、邮政编码、电话号码等等),通信录数据类型定义为结构体类型。由键盘输入数据(最好要考虑输入数据输入的格式及输入数据的有效性),然后进行以下的功能实现。程序要求主函数是一个功能选择菜单,其它各功能都用各自的函数实现。
功能要求如下:
1、能建立、修改和增删学生通讯录
2、能够按多种方式进行查询,例如按姓名、按电话号码等。
3、通讯录的数据保存在文件中,运行程序时将通讯录数据从文件读取到内存中。对通讯录进行增加、删除、修改学生数据后,提供功能菜单,可以将内存中修改过的通讯录重新保存至文件。
二、应用程序功能的详细说明
1、应用程序实现了可视化的系统操作界面。
2、对学生通讯录形成了系统化的管理,操作简便明了。
3、程序具有系统帮助,添加、显示、查询、刷新、删除、排序、保存、修改、读取学生通讯录的功能。各项功能均可按照文字提示操作,浅显易懂。
4、系统的各个功能模块都用函数的形式来实现(readfile()、seek()、modify()、sort()、insert()、del()、save()、menu())方便查看。
5.可以将信息保存在文件(“student.txt“)中,亦可将信息从文件中读取出来,灵活方便。
三、主要模块的算法描述
学生通讯录管理系统
刷新学生信息readfile()
查询学生信息seek()
增加学生信息insert()
显示学生信息display()
退出系统
修改学生信息modify()
删除学生信息del()
保存当前学生信息save()
汇总当前学生数目number()
系统帮助help()
查询学生信息
按姓名查询
退出
按学号查询
开始
以可读写的方式打开一个数据文件
将此文件的内容读出,并存入一个新的结构体类型的数组中。
调用menu()菜单函数
进入while()主循环
输入1-8中的一数值,选择相应操作。
输入是否为0
判断键值,调用相应函数,完成相应功能。
是否已对修改存盘
调用函数save()函数,进行写数据文件操作
结束
模块一:头文件,变量定义,函数的声明
对系统所使用的变量进行定义,对函数进行声明。
模块二:录入学生信息
声明函数void
readfile(),说明一个文件指针FILE
*fp打开文
件“student.txt“。
模块三:学生信息的查找
声明void
seek()为查找函数,通过switch(item)设定用学号查找,
用姓名查找两个分支。
模块四:学生信息的修改
声明void
modify()为学生信息修改函数,通过switch(item)设定
所要修改的项目。
模块五:刷新学生信息
声明void
sort()将录入学生系按升序排列,用的是“冒泡排序法”
实现排序。
模块六:增加学生信息
声明void
insert()插入学生信息,先通过判断学生是否存在,若
否则继续输入,若是则跳出,重新循环。
模块七:删除学生信息
声明void
del()实现学生信息删除,通过学号对比确定要删除的信
息,然后用后一个替换掉。
模块八:显示学生信息
通过display()函数输出学生信息。
模块九:保存信息
通过fp=fopen(“student.txt“,“w“);写入信息。
模块十:汇总学生数目
通过number()函数将已有男女生及总学生数目汇总出来。
模块十一:系统帮助
通过help()函数帮助操作。
模块十二:界面菜单
通过switch(num)调用以上各函数,实现功能。
1、程序采用模块化设计,各模块独立,可分块调试,个模块由主函数控制调用。
2、其中主要模块(readfile()、seek()、modify())都是利用数组,指针来实现数据结构设计。
3、数据库设计的任务是确定系统所需要的数据库。数据库是表的集合,通常一个系统只需一个数据库。设计人
是根据需求分析,确定数据库所包含的表及字段、表间的关系,然后具体确定表的结构,包括字段名、字段类型及宽度,需要的索引等。根据对需求得到的数据结构进行分析,按数据输入输出的要求,确定表和表间的关系,进行验证、调整、修改、完善,使其能够实现用户对数据和功能的要求。通讯信息表包括以下字段:学号,
姓名,年龄,性别,出生年月,地址,电话,
E-mail。学号为主索引。
四、结束语
我设计的程序总体功能大都能够运行顺利,但有许多地方比较复杂,需要进一步修改,进行简化。通过这次课程设计的锻炼,我收获很多,具体归纳为以下几点:
1、首先,也是最重要的一点,学会如何将一个复杂的问题简化,将一个较大的问题分成几个小问题,再一一解决这些小问题。在设计一个程序之前,要学会对程序功能进行规划,将其分为几个不同的功能模块,要思路清晰,简单易用;
2、学会灵活运用已有的知识,同时适当的拓展一些知识;比如,这次设计过程中,有一些函数以前就很少用到,甚至没有见过,但对程序的设计及用户界面的改善带来方便;
3、解决问题时,要尽可能考虑全面。每一个细节都很重要,既要避免功能的重复,也要避免功能疏漏的地方!
4、在这次课程设计过程中,参考了许多资料,发现C语言真的很有意思!比如我看到一个关于用C语言编写的小程序:五子棋、俄罗斯方块、推箱子等,等这次课程结束后,我就想利用C语言编写这些小游戏。曾经认为C是个挺枯燥的课程,现在发现这不仅仅是个简单的课程,而是个很实用的计算机工具!
五、程序源代码清单
#include
#include
#include
#define
BUFLEN
100
#define
LEN
15
#define
N
100
struct
record
{
char
code[LEN+1];
char
name[LEN+1];
int
age;
char
sex[3];
char
time[LEN+1];
char
add[30];
char
tel[LEN+1];
char
mail[30];
}stu[N];
int
k=1,n,m;
void
readfile();
void
seek();
void
modify();
void
insert();
void
del();
void
display();
void
save();
void
number();
void
menu();
int
main()
{
while(k)
menu();
system(“pause“);
return
0;
}
void
readfile()//刷新学生信息
{
char
*p=“student.txt“;
FILE
*fp;
int
i=0;
if
((fp=fopen(“student.txt“,“r“))==NULL)
{
printf(“Open
file
%s
error!
Strike
any
key
to
exit!“,p);
system(“pause“);
exit(0);
}
while(fscanf(fp,“%s
%s%d%s
%s
%s
%s
%s“,stu[i].code,stu[i].name,&stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail)==8)
{
i++;
i=i;
}
fclose(fp);
n=i;
printf(“录入完毕! “);
}
void
seek()//查询学生信息
.
.
.
.
.
.
void
modify()//修改学生信息
.
.
.
.
.
.
void
sort()//对学生信息按学号排序
{
int
i,j,*p,*q,s;
char
temp[10];
for(i=0;i
{
for(j=n-1;j>i;j--)
if(strcmp(stu[j-1].code,stu[j].code)>0)
{
strcpy(temp,stu[j-1].code);
strcpy(stu[j-1].code,stu[j].code);
strcpy(stu[j].code,temp);
strcpy(temp,stu[j-1].name);
strcpy(stu[j-1].name,stu[j].name);
strcpy(stu[j].name,temp);
strcpy(temp,stu[j-1].sex);
strcpy(stu[j-1].sex,stu[j].sex);
strcpy(stu[j].sex,temp);
strcpy(temp,stu[j-1].time);
strcpy(stu[j-1].time,stu[j].time);
strcpy(stu[j].time,temp);
strcpy(temp,stu[j-1].add);
strcpy(stu[j-1].add,stu[j].add);
strcpy(stu[j].add,temp);
strcpy(temp,stu[j-1].tel);
strcpy(stu[j-1].tel,stu[j].tel);
strcpy(stu[j].tel,temp);
strcpy(temp,stu[j-1].mail);
strcpy(stu[j-1].mail,stu[j].mail);
strcpy(stu[j].mail,temp);
p=&stu[j-1].age;
q=&stu[j].age;
s=*q;
*q=*p;
*p=s;
}
}
}
void
insert()//增加学生信息
.
.
.
.
.
.
void
display()//显示当前学生信息
{
int
i;
printf(“所有学生的信息为: “);
printf(“学生学号,
学生姓名,
年龄,
性别,
出生年月,
地址,
电话,
E-mail “);
printf(“-------------------------------------------------------------------- “);
for(i=0;i
{
printf(“%6s,
%7s,
%5d,
%5s,
%9s,
%8s,
%10s,
%14s “,stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
}
void
save()//保存当前学生信息
{
int
i;
FILE
*fp;
fp=fopen(“student.txt“,“w“);
for(i=0;i
{
fprintf(fp,“%s,
%s,
%d,
%s,
%s,
%s,
%s,
%s “,stu[i].code,stu[i].name,stu[i].age,
stu[i].sex,stu[i].time,stu[i].add,stu[i].tel,stu[i].mail);
}
fclose(fp);
}
void
number()//汇总学生数目
{
int
i,girl,boy=0;
for(i=0;i
if(strcmp(stu[i].sex,“1“)==0)
{boy++;}
girl=n-boy;
printf(“男生人数是:%d 女生的人数是:%d “,boy,girl);
printf(“总的学生人数为:%d“,n);
}
void
help()//系统帮助
{
printf(“输入性别时男为1,女为2“);
printf(“ 3.增加学生信息后,切记保存按7; “);
printf(“ 4.谢谢您的使用! “);
}
void
menu()//可视化的系统操作界面
{
int
num;
printf(“
学生通讯录管理系统
“);
printf(“
*********************系统功能菜单************************
“);
printf(“
--------------------------------
-------------------------------
“);
printf(“
1.刷新学生信息
2.查询学生信息
“);
printf(“
*********************************************
“);
printf(“
3.修改学生信息
4.增加学生信息
“);
printf(“
*********************************************
“);
printf(“
5.按学号删除信息
6.显示当前信息
“);
printf(“
*********************************************
“);
printf(“
7.保存当前学生信息
8.汇总学生数目
“);
printf(“
*********************************************
“);
printf(“
9.系统帮助
10.退出系统
“);
printf(“
---------------------------------
------------------------------
“);
printf(“
************************************************************
“);
printf(“请选择菜单编号:“);
scanf(“%d“,&num);
switch(num)
{
case
1:readfile();break;
case
2:seek();break;
case
3:modify();break;
case
4:insert();break;
case
5:del();break;
case
6:display();break;
case
7:save();break;
case
8:number();break;
case
9:help();break;
case
10:k=0;break;
default:printf(“请在1-10之间选择 “);
}
}
第三篇:图书管理系统数据库设计
3 数据库设计 ................................................................. 2 3.1 专门术语的定义 ................................................... 2 3.1.1 系统中常用的术语(或使用频率较高的术语) ......................... 2 3.1.2 表格定义及规范 ................................................. 2 3.1.2.1数据约定 ..................................................... 2 3.1.2.2表和表字段命名规范: .
3 数据库设计
3.1 专门术语的定义
暂无
3.1.1 系统中常用的术语(或使用频率较高的术语) 暂无
3.1.2 表格定义及规范 3.1.2.1数据约定
所有数据项都用英文、汉语拼音或缩写表示,数据库名称除外。
所有字段在设计时,除以下数据类型timestamp、image、datetime、smalldatetime、uniqueidentifier、binary、sql_variant、binary 、varbinary外,必须有默认值。字符型的默认值为一个空字符值串;数值型的默认值为数值0;逻辑型的默认值为数值0;
其中:系统中所有逻辑型中数值0表示为“假”;数值1表示为“真”。 datetime、smalldatetime类型的字段没有默认值,必须为NULL。 当字段定义为字符串形时建议使用varchar而不用nvarchar。 建议在大多数表中(如报销单,申请单),应都有以下字段: 字段名说明类型默认值 CreatorID创建者int CreatedTime创建时间DatetimeNULL 字符集采用 UTF-8,请注意字符的转换。
所有数据表第一个字段都是系统内部使用自动序列主键列,自增字段,不可空,名称为:id,确保不把此字段暴露给最终用户。
除特别说明外,所有字符串字段都采用varchar(50) 类型,(无论汉字还是英文,都算一个字符)。
除特别说明外,所有小数的字段都采用 decimal(18,2) 的形式表达。
除特别说明外,所有日期格式都采用 datetime 格式(根据需要提取时间格式); 除特别说明外,所有整形都采用 bigint 格式。 除特别说明外,所有字段默认都设置为 null 。 3.1.2.2表和表字段命名规范:
命名规则约束的范围包括:数据库的命名、表的命名及字段的命名。数据库相关的命名规则采用与通常的编程的变量命名规则原则一致,具体要求如下: 1) 字段名及表名为典型的名词结构; 2) 中文名称要求语言精练、文法严谨;
3) 望文知意、易懂易用,禁止采用如:A002这种命名;
4) 主体采用拼音字母的首写字母拼写构成,基于惯常法可适度采用无词义歧义性的英文命名;
5) 长度不少于3个字母,不大于12个字母;
6) 在对于拼音首字母类似的字段和表,为区别,添加下划线和数字如男性人数:NXRS,女性人数:NXRS_2。
3.2 数据设计
绘制数据流程图的目的是为了方便开发人员与用户的交流,以及为系统的设计提供依据。数据流程图的绘制过程通常采用自顶向下,逐层分解,直到功能细化为止,形成若干层次的数据流程图。 3.2.1 数据流程图设计
0层数据流图
1层数据流图
3.2.2实体关系结构设计
图书实体关系
读者实体关系
图书借阅关系实体
用户实体关系
图书类别实体关系
3.3安全保密设计
3.3.1 逻辑上的安全保密
1、系统对非法使用者的安全保密处理措施
2、系统对正常使用者的安全保密处理措施
3、系统对管理员的安全保密 3.3.2 物理上的安全保密
1、数据库系统异常时的还原处理措施
2、设备遭异常毁坏时的安全防护措施
3、数据参数做到及时更新,保证系统正常运行
3.4 表格与功能模块相关性分析
3.5 表格定义
a.图书信息表
b.读者信息表
c.借阅表
d.管理员_书籍
e.管理员_学生
第四篇:数据库系统设计期末考总结
数据库系统设计期末考总结 什么是数据库?
数据库是被一个系统所使用的所有数据的集合 数据库管理员(Database Administrator) 什么是数据库管理系统?(DBMS)
数据库管理系统就是帮助存储,管理和使用数据库的程序的集合,对数据库进行统一的管理和控制,以保证数据库的安全性和完整性
DBMS(database management system)数据库管理系统环境组成
硬件,软件,数据,程序(procedures),人 数据库系统开发生命周期(database system development lifecycle)
数据库设计的三个主要步骤: 概念设计 逻辑设计 物理设计
C/S vs B/S C/S
即Client/Server (客户机/服务器) 结构,通过将任务合理分配到Client端和Server端,降低了系统的通讯开销,需要安装客户端才可进行管理操作。
客户端和服务器端的程序不同,用户的程序主要在客户端,服务器端主要提供数据管理、数据共享、数据及系统维护和并发控制等,客户端程序主要完成用户的具体的业务。
开发比较容易,操作简便,但应用程序的升级和客户端程序的维护较为困难。
三层C/S构架
在三层架构中,客户端接受用户的请求,客户端向应用服务提出请求,应用服务从数据库服务中获得数据,应用服务将数据进行计算并将结果提交给客户端,客户端将结果呈现给用户。
两层和三层的区别? 两层架构
Client side presented two problems preventing true scalability: „Fat‟ client, requiring considerable resources on client‟s computer to run effectively.
Significant client side administration overhead. By 1995, three layers proposed, each potentially running on a different platform. 客户端提出的两个问题阻止真正的可伸缩性:
脂肪”客户端,需要相当大的客户端电脑上的资源有效地运行。
重大的客户端管理开销。
三层架构
Advantages:
‘Thin’ client, requiring less expensive hardware. Application maintenance centralized.
Easier to modify or replace one tier without affecting others.
Separating business logic from database functions makes it easier to implement load balancing.
Maps quite naturally to Web environment. 优点: 瘦”客户机,需要更少的昂贵的硬件。 应用程序维护集中。
容易修改或替换一个层而不影响其他。
将业务逻辑与数据库函数分开使其容易实现负载平衡。 很自然地映射到Web环境。
Three main types of transactions(三种主要类型的事务):
retrieval transactions检索事务
update transactions更新交易处理
mixed transactions混合事项
B/S
即Browser/Server (浏览器/服务器) 结构,用户界面完全通过WWW浏览器实现。
客户端基本上没有专门的应用程序,应用程序基本上都在服务器端。由于客户端没有程序,应用程序的升级和维护都可以在服务器端完成,升级维护方便。由于客户端使用浏览器,使得用户界面“丰富多彩”,但数据的打印输出等功能受到了限制。
SQL SQL分类:
DDL—数据定义语言(CREATE,ALTER,DROP,DECLARE)
DML—数据操纵语言(SELECT,DELETE,UPDATE,INSERT)
DCL—数据控制语言(GRANT,REVOKE,COMMIT Query(查询) Security(安全) Index(索引) View(视图)
ERD A five-step process for ERD construction : ERD构建五个步骤的过程: Step1: Represent Entities as Tables(将实体转换成表) Step2: Determine Relationships(确定关系)
In most cases, a record in one table will correspond to multiple records in another table. 在大多数情况下,一个表的记录将对应于另一个表中的多条记录。
For many-to-many relationships, a new associative table must be created between two tables. 多对多关系,必须创建一个新的关联表两个表之间的关系。
Step3:List Fields(确定表的属性)
Step4: Identify Keys(确定键,主键和外键) Step5: Determining Data Types确定数据类型
Primary and foreign keys must match in data type and size. 主键和外键必须匹配的数据类型和大小。
2.主键
A primary key uniquely identifies each record in a table. 主键唯一标示表中的每一条记录。
Unique Minimal Not Null Nonupdateable 3.外键
如果公共关键字在一个关系中是主关键字,那么这个公共关键字被称为另一个关系的外键。 4.完整性
实体完整性:每个表一定要有一个合法主键。(主键值唯一) 参照完整性规则(Referential Integrity):若属性组F是关系模式R1的主键,同时F也是关系模式R2的外键,则在R2的关系中,F的取值只允许两种可能:空值或等于R1关系中
某个主键值。(外键,的值在主键中没有出现) 5.范式
第一范式:(1NF)强调的是列的原子性,即列不能够再分成其他几列。 Definition: A table in which all fields contain a single value. 第二范式:(2NF)属性完全依赖于主键Definition: A table in which each non-key field is determined by the whole primary key and not part of the primary key by itself. 没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
第三范式:(3NF)属性不依赖于其它非主属性
首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。 6.Normalization规范化
没有进行规范化的数据存在插入(表没有分开,插入数据是产生异常),更新(数据冗余,更新时产生异常),删除异常(表没有分开,数据间存在依赖关系)同一张表自身设计不合理导致异常
规范化的优缺点
优点:
• 消除更新异常 • 减少数据冗余
• 解决了数据完整性问题 • 节省存储空间
缺点: • 涉及多表的子查询和表之间的联接,需要更复杂的SQL语句
• DBMS的额外工作使应用程序变慢
7.关系型数据库优点
依赖逻辑,而不是物理、相关记录之间的联系
使用第四代语言(4 gl) 备抵高度的数据独立性
Weak Entity(弱实体)
一个实体对于另一个实体具有很强的依赖关系,而且该实体主键的一部分或者全部都是从其他强实体中获得,则称该实体为弱实体
Derived attribute(派生属性)
Attribute that represents a value that is derivable from value of a related attribute, or set of attributes, not necessarily in the same entity. 属性代表了一个值从一个相关属性中派生出来的,或一组属性的值引出,,不一定在同一个实体。
recursive relationship(递归关系)
添加一个外键,使得有一对多的关系,多对多关系
complex relationship(复杂关系) Multiplicity is the number (or range) of possible occurrences of an entity type in an n-ary relationship when other (n-1) values are fixed.
problems in an ER model Often due to a misinterpretation of the meaning of certain relationships. 通常由于特定的意义关系的误解。 connection traps. (连接陷阱) 俩个主要的连接陷进:扇形陷进和深坑陷进
扇形陷进:两个实体有一个一对多的关系,从而扇出第三个实体,两个实体键本该有一个直接关系提供必要信息 深坑陷进:一个模型显示实体之间的存在关系,但某些实体出现之间的路径不存在。
Supertype/Subtype Hierarchies(超类和子类) 某个实体类型中所有实体同时也是另一个实体类型的实体.此时,我们称前一实体类型是后一实体类型的子类(Subtype),后一实体类型称为超类(Supertype). 但是子类有一个很重要的性质:继承性。子类继承其超类上定义的所有属性,其本身还可以包含其他另外的属性. 第九章:
磁盘的性能指标:磁盘的容量,存取时间,数据传输速度,可靠性
磁盘的总容量
记录盘面数*每记录盘面的磁道数*每磁道的扇区数*每扇区的字节数
扇区:扇区是磁盘寻址的最小单位,其大小通常是512字节 数据在磁盘上的定位信息:柱面号,磁头号,扇区号 编址方法:柱面从外向内编址(如:0~199),磁道按柱面编号(如:0号柱面从上向下编号0~19,再给1号柱面磁道编号),盘块号(假设每个磁道有17个扇区,0号柱面0号磁道0号扇区的盘块号为0,0号柱面1号磁道0号扇区的盘块号为17)
Access time (存取时间)– the time it takes from when a read or write request is issued to when data transfer begins. (一个读或写请求发出到数据开始传输的时间) Consists of: Seek time (寻道时间)– time it takes to reposition the arm over the correct track.
将磁头移到柱面的时间:约2~30ms Rotational latency (旋转等待时间)– time it takes for the sector to be accessed to appear under the head.
约10~20ms 总时间:10~40ms
Data-transfer rate – the rate at which data can be retrieved from or stored to the disk. (从磁盘上读取数据或存储数据到磁盘的时间)
Mean time to failure (MTTF) (平均失效时间)– the average time the disk is expected to run continuously without any failure.(磁盘无故障连续运行的时间Typically 3 to 5 years)
Block – a contiguous sequence of sectors from a single track data is transferred between disk and main memory in blocks sizes range from 512 bytes to several kilobytes 内存和外存的一次数据交换称为一次I/O操作,每次交换的数据量是一个Block 内存中开辟的缓冲区大小至少要等于一个block Block的大小通常由DBMS厂商决定
廉价磁盘冗余阵列(RAID) Redundant Arrays of Independent Disks 通过冗余提高可靠性
是一种利用大量廉价磁盘进行磁盘组织的技术
价格上,大量廉价的磁盘比少量昂贵的大磁盘合算得多 性能上,使用大量磁盘可以提高数据的并行存取
可靠性上,冗余数据可以存放在多个磁盘上,因此一个磁盘的故障不会导致数据丢失 冗余(Redundancy)
存储额外的信息,以便当磁盘故障时能从中重建
磁盘还是内存?
5-minute rule:如果一个被随机访问的页面的使用频率超过每5分钟一次,那么它应该被驻留在内存
minute rule:如果被顺序访问的页面的使用频率超过每1分钟一次,那么它应该被驻留在内存
文件存储:
The database is stored as a collection of files. Each file is a sequence of records. A record is a sequence of fields 数据库是存储为文件的集合。每个文件都是一个序列的记录。字段的记录是一个序列。
第十章:
Basic Steps in Query Processing(查询处理的基本步骤): 1. Parsing and translation解析和翻译 2. Optimization最优化 3. Evaluation评估
RDBMS查询处理阶段 : 1. 查询分析 2. 查询检查 3. 查询优化 4. 查询执行
选择操作典型实现方法:
1. 简单的全表扫描方法
对查询的基本表顺序扫描,逐一检查每个元组是否满足选择条件,把满足条件的元组作为结果输出 适合小表,不适合大表 2. 索引(或散列)扫描方法
适合选择条件中的属性上有索引(例如B+树索引或Hash索引) 通过索引先找到满足条件的元组主码或元组指针,再通过元组指针直接在查询的基本表中找到元组
排序
原因
SQL查询可以指定对输出进行排序
关系运算的某些操作,如连接运算,排序后实现高效
对于可放进内存的关系,使用如快排序之类的技术。对不能放进内存的关系,使用外排序
内排序
当数据集小于可用内存时,采用快速排序算法 快速排序的思想来源于分治策略。将数据块划分为两个序列,第一个序列的值小于第二个序列,在两个序列中按照递归排序的思想再次进行上述的划分,这样直到没有办法划分为止
外排序
创建有序段+N路归并
所有的输入数据最初分成许多有序的归并段文件,然后不断归并成许多更大的归并段文件,直到剩下一个文件为止
Join Operation 几种不同的连接算法
Nested-loop join(嵌套循环连接)
Block nested-loop join(块嵌套循环连接) Indexed nested-loop join(索引嵌套循环连接) Merge-join(合并连接) Hash-join(哈希或散列连接)
Choice based on cost estimate(根据成本估算选择连接方式)
关系型数据库优点
依赖逻辑,而不是物理、相关记录之间的联系
使用第四代语言(4 gl) 备抵高度的数据独立性
关系数据库系统的查询优化
查询优化的优点不仅在于用户不必考虑如何最好地表达查询以获得较好的效率,而且在于系统可以比用户程序的“优化”做得更好
(1) 优化器可以从数据字典中获取许多统计信息,而用户程序则难以获得这些信息
(2)如果数据库的物理统计信息改变了,系统可以自动对查询重新优化以选择相适应的执行计划。在非关系系统中必须重写程序,而重写程序在实际应用中往往是不太可能的
(3)优化器可以考虑数百种不同的执行计划,程序员一般只能考虑有限的几种可能性。
(4)优化器中包括了很多复杂的优化技术,这些优化技术往往只有最好的程序员才能掌握。系统的自动优化相当于使得所有人都拥有这些优化技术
RDBMS关系型数据库管理系统(Relational Database Management System)通过某种等价模型计算出各种查询执行策略的执行代价,然后选取代价最小的执行方案 集中式数据库
执行开销主要包括:
– 磁盘存取块数(I/O代价) – 处理机时间(CPU代价) – 查询的内存开销 I/O代价是最主要的
分布式数据库
总代价=I/O代价+CPU代价+内存代价+通信代价
查询优化的总目标: 选择有效的策略
求得给定关系表达式的值
使得查询代价最小(实际上是较小) 实际系统的查询优化步骤:
1. 将查询转换成某种内部表示,通常是语法树
2. 根据一定的等价变换规则把语法树转换成标准(优化)形式 3. 选择低层的操作算法 对于语法树中的每一个操作
• 计算各种执行算法的执行代价 • 选择代价小的执行算法
4. 生成查询计划(查询执行方案) 查询计划是由一系列内部操作组成的。 2 代 数 优 化
代数优化策略:通过对关系代数表达式的等价变换来提高查询效率
关系代数表达式的等价:指用相同的关系代替两个表达式中相应的关系所得到的结果是相同的
两个关系表达式E1和E2是等价的,可记为E1≡E2
具体方法 笛卡尔积
查询树的启发式优化 典型的启发式规则:
1. 选择运算应尽可能先做。在优化策略中这是最重要、最基本的一条
2. 把投影运算和选择运算同时进行
如有若干投影和选择运算,并且它们都对同一个关系操作,则可以在扫描此关系的同时完成所有的这些运算以避免重复扫描关系 3. 把投影同其前或其后的双目运算结合起来
4. 把某些选择同在它前面要执行的笛卡尔积结合起来成为一个连接运算
5. 找出公共子表达式
如果这种重复出现的子表达式的结果不是很大的关系并且从外存中读入这个关系比计算该子表达式的时间少得多,则先计算一次公共子表达式并把结果写入中间文件是合算的
当查询的是视图时,定义视图的表达式就是公共子表达式的情况
6. 在执行连接操作前对关系适当进行预处理
按连接属性排序 在连接属性上建立索引
索引:
Search Key(检索关键字)1)之间的值。 B+-Tree Node Structure(节点结构)
P1是指针,指向子节点(非叶子结点)或指向记录内容(叶子结点) Ki are the search-key values K1是关键字检索值 B+-Tree中的叶子结点
ACID properties of a Transaction(事务的ACID属性)
原子性(Atomicity):一个事务中的所有操作要么全部成功,要么全部失败。原子性由恢复机制实现。 一致性(Consistency):事务完成后,所有数据处于应有的状态,所有内部结构正确,能够准确反映事务所作的工作。基于隔离性实现。
隔离性(Isolation):一个事务不会干扰另一个事务的进程,事务交叉调度执行的结果与串行调度执行的结果是一致的。隔离性由并发控制机制实现。
持久性(Durability):事务提交后,对数据库的影响是持久的,即不会因为系统故障影响事务的持久性。持久性由恢复机制实现。
事务调度:
事务的执行顺序称为一个调度,表示事务的指令在系统中执行的时间顺序
一组事务的调度必须保证
包含了所有事务的操作指令
一个事务中指令的顺序必须保持不变 串行调度
在串行调度中,属于同一事务的指令紧挨在一起 对于有n个事务的事务组,可以有n!个有效调度 并行调度
在并行调度中,来自不同事务的指令可以交叉执行 当并行调度等价于某个串行调度时,则称它是正确的
锁
锁的作用
一个事务对某个数据对象加锁,取得对它一定的控制,限制其它事务对该数据对象的使用,由此提供事务需要的隔离性,保证各个事务不会互相干扰,一个事务不会读取或修改另一个事务正在使用的数据。
此外,锁提供的隔离性还保证事务的一致性。
为了使系统性能良好,应使事务尽量简短和不受干扰。 要访问一个数据项R,事务Ti必须先申请对R的封锁,如果R已经被事务Tj加了不相容的锁,则Ti需要等待,直至Tj释放它的封锁
锁的模式主要有六种:共享锁、更新锁、排他锁、结构锁、意向锁和块更新锁。
共享锁(S锁,Share lock)
事务T对数据对象R加上S锁,则其它事务对R的X锁请求不能成功,而对R的S锁请求可以成功;又称读锁
申请对R的共享锁: lock-S(R) 用于只读数据操作,它允许多个并发事务读取(Select)锁定资源,但禁止其它事务对锁定的资源进行修改。一般读取数据后就释放共享锁,除非要将锁升级。 排它锁(X锁,eXclusive lock)
事务T对数据对象R加上X锁,则其它事务对R的任何封锁请求都不能成功,直至T释放R上的X锁;又称写锁
申请对R的排它锁:lock-X(R) 一般来说,SQL Server在事务结束时释放排他锁。 Two-Phase Locking Protocol 两阶段封锁协议内容
增长阶段(Growing Phase)
事务可以获得锁,但不能释放锁 缩减阶段(Shrinking Phase) 事务可以释放锁,但不能获得锁
封锁点:事务获得其最后封锁的时间
事务调度等价于和它们的封锁点顺序一致的串行调度 死锁:
两个事务都封锁了一些数据对象,并相互等待对方释放另一些数据对象以便对其封锁,结果两个事务都不能结束,则发生死锁
死锁发生的条件
①互斥条件:事务请求对资源的独占控制
②占有等待条件:事务已持有一定资源,又去申请并等待其它资源 ③非抢占条件:直到资源被持有它的事务释放之前,不可能将该资源强制从持有它的事务夺去
④循环等待条件:存在事务相互等待的等待圈
预防死锁
预先占据所需的全部资源,要么一次全部封锁要么全不
封锁
缺点:难于预知需要封锁哪些数据并且数据使用率低
所有资源预先排序,事务按规定顺序封锁数据 使用抢占与事务回滚
• wait-die:如果T1等待T2,仅当T1的时间戳小于T2时,允许T1等待,否则回滚T1。
• wound-wait:如果T1等待T2,仅当T1的时间戳大于T2时,允许T1等待,否则回滚T2 死锁检测和恢复
超时法
如果等待封锁的时间超过限时,则撤消该事务
等待图法
第五篇:教务管理系统 数据库实例设计
第17章 数据库系统设计实例
本章以一个考务管理系统的设计过程为例,介绍在VB 6.0+SQL Server 2000环境中开发数据库系统的一般方法。
17.1 系统概述
17.1.1 系统功能
本系统用于从考生报名、产生准考证到录取考生和打印成绩单即对考生考试和录取全过程进行管理的考务系统,包含主要功能如下:
考生报名,按报名顺序产生报名号
产生准考生号和以紧凑方式打印准考证 输入考生考试成绩和输入录取合格标准 根据合格标准录取上线考生 打印考生成绩单和考生录取通知书 设置系统用户和系统初始化
17.1.2 设计技巧
本系统设计中的一些技巧如下: 公共模块设计(参见17.4节的Module1.Bas模块) SQL Server数据库设计(参见17.3节) VB菜单设计方法(包括菜单项的有效性设计,对于“一般操作员”,使若干菜单项无效。参见menu多文档窗体设计过程) 统一的数据编辑设计方法:以ksb表为例进行说明:为了编辑其记录,设计了edks窗体,在其中的DataGrid数据网格控件中显示所有已输入的考生记录。用户可以先通过“设置条件”框架查找到满足指定条件的考生记录,然后选择“修改”或“删除”命令按钮进行考生记录的修改或删除,或者选择“添加”命令按钮输入新的考生记录。 VB报表设计方法(包括使用Data Report设计器和PrintForm方法) 图像数据的存取方法(参见edks窗体设计过程) 事件编程技术:一些数据编辑窗体(如edks等窗体)上有两个事件过程即Load和Activate,它们的执行过程是:在启动本窗体时先执行Load(仅执行一次)事件过程,