数据库课程设计文档.docx
《数据库课程设计文档.docx》由会员分享,可在线阅读,更多相关《数据库课程设计文档.docx(15页珍藏版)》请在冰豆网上搜索。
数据库课程设计文档
数据库系统原理
课程设计文档
学号:
姓名:
一、DBMS的实现方式
四张基本表,以文本文档形式存储,分别是数据字典,用户表,关系属性表,关系数据表。
数据字典用来存储关系名,以换行符进行区别,建立索引时,在相应关系名后存储索引表名,以逗号进行区别,数据操作时,先查数据字典,是否有此关系名或相应索引表名,才能继续操作。
用户表用来存储用户信息,以逗号进行区别,第零列为用户名,第一列为用户口令,第三列为用户相应权限,“0”代表后台管理者,可以查询和添加用户,“1”代表数据库管理员,可以做增,删,改,查操作,但不能添加用户,“2”代表普通用户,只能做查询操作,用户登陆时,通过对用户名跟口令的匹配,返回第三列权限值。
关系属性表用来存储关系属性名,即列名,以逗号区别。
关系数据表用来存储关系数据,行内以逗号区别,行间以换行符区别。
二、DBMS的功能介绍
(1)createtable
建立新关系,权限为1
(2)droptable
删除关系,权限为1
(3)altertable
add添加表属性,并添加相应属性数据,权限为“1”
drop删除表属性,权限为“1”
(4)insert
插入数据,以行为单位,权限为“1”
(5)delete
删除数据,以行为单位,权限为“1”
(6)update
修改数据,权限为1
(7)select
查询操作,权限为“0”,“1”,“2”都可以
(8)createindex
建立索引
(9)dropindex
删除索引
(10)createuser
添加用户,权限为“0”
三、DBMS算法实现
算法描述
char*bdsctq(chara[],charb)
表达式串提取,根据第二参数为‘l’或‘r’,提取表达式左部或又部串
char*ctq(chara[],intb)
关键字串提取,根据字符个数提取关键字
voiddgxty(charch1[],charc[],intb)
单关系投影,参数为:
关系属性表名,关系数据表名,投影所在列
voiddgxxz(charch[],charch1[],charch2[],charch3[],charch4[],inta1,inta2)
单关系选择,参数为:
关系数据表名,选择值1,选择值2,and或or,选择后生成表名,选择属性所在列1,所在列2
voiddgxyhxz(charch[],charch1[],charch2[],inta1)
单关系优化选择,与上述函数类似,只不过上述函数比较两列,此函数只比较一列
char*dhctq(chara[],intb)
根据逗号提取串,根据第i个逗号提取i到i+1间的串
intgxcz(charz[],chara[])
关系查找,根据关系属性表和属性名的匹配,返回此属性名所在的列数
char*gxmtq(chara[],intb)
新建模式关系名提取
voidgxxg(charp[],chara[])
关系属性修改,根据关系属性表和属性名的匹配,并将其删除,保留其它属性
char*kgctq(chara[],intb)
根据空格提取串
voidlgxlj(charch[],charch1[],charch2[],charch3[],inta1,inta2,charch4[],charch5[])
两关系连接,参数为:
连接数据表1,连接数据表2,连接后生成的属性表名,连接后生成的数据表名,连接属性在原属性表列数1,连接属性在原属性表列数2,原属性表1,原属性表2。
三关系连接时两次调用
voidlgxsylj(chara[],chara1[],chara2[],chara3[],chara4[])
两关系索引连接,参数为:
连接数据表1,连接数据表2,索引表1,索引表2,连接后生成的数据表名
char*lmtq(chara[])
列名提取,提取括号内字符,数据插入时也可用
voidsgxty(charch[],charch1[],inta,inta1,inta2)
三关系投影,参数为:
投影属性表名,投影数据表名,三个属性所在列
voidshop1(chara[])
属性表文件输出
voidshop2(chara[])
数据表文件输出
voidsjsc(charch[],charch1[],inta1)
数据删除,参数为:
数据表名,所要删除的数据值,所要删除值所在的属性列
voidsjsy(chara[],chara1[],intb1)
数据索引,参数为:
要建索引的原数据表名,索引表名,
要建索引的数据所在列
voidsjxg(charch[],charch1[],charch2[],inta1,inta2)
数据修改,参数为:
所要修改的数据表名,修改的判断属性值,要修改的值,修改的判断属性所在列,要修改的属性所在列
voidtjsxsjxg(charch[])
添加相应数据,添加属性时调用,在相应数据表里添加一列新数据,对应新属性
char*yhpp(charch[],charch1[])
用户匹配,参数为:
用户名,用户口令,匹配成功后,以字符串形式返回其相应权限
voidyhty(charch[],charch1[],inta1,inta2,inta3,charch3[],charch4[])
优化投影,参数为:
属性表名,数据表名,投影的三个属性所在列,投影后生成的属性表名,生成的数据表名
voidzdcrxg(chara[])
字典插入修改,新建关系时,修改字典内容
intzdcz(chara[])
字典查找,查找关系名是否存在,存在,返回“0”,否则返回“1”
voidzdsysc(chara1[])
字典索引删除,删除索引时,修改字典内容
voidzdsyxg(chara1[],chara2[])
字典索引修改,添加索引时,修改字典内容
voidzfsr(chara[])
字符输入,以分号为结束标志,输入有回车时,转换为空格处理,当检测到有多空格时,只保留一空格
程序流程图
附下页
图1.1算法流程
四、实验测试用例与结果
注:
篇幅所限,只列举一些操作用例,具体功能可运行程序测试
数据字典和三张要操作的基本表:
以user1管理员登陆:
管理员权限可进行的相应操作:
建表,插入数据:
修改数据:
添加属性:
删除数据:
查询,多关系,多条件的连接,选择,投影操作:
查询优化,执行结果与上述一致:
下页续…
建立索引,第一列为索引数据,第二列为索引域值:
实现索引上的连接,连接后的数在索引属性上据是有序的:
以后台管理员登陆,可以添加用户:
五、关键技术
注:
列举两个较关键,比较难一点的处理函数
voidsjxg(charch[],charch1[],charch2[],inta1,inta2)//数据修改
{
FILE*f1;
charb,b2[200][200],b3[50][50],b4[200],b5[200];
inti=0,j=0,k=0,n=0;
f1=fopen(ch,"r");//要修改的数据读入二维数组
b=fgetc(f1);
while(b!
=EOF)
{
while(b!
='\n')
{
b2[i][j]=b;
b=fgetc(f1);
j++;
}
b2[i][j]='\0';
i++;
j=0;
b=fgetc(f1);
}
strcpy(b2[i],"$");//加结尾符
fclose(f1);
i=0;
while(strcmp(b2[i],"$")!
=0)//判断是否到达文件末尾
{
if(strcmp(dhctq(b2[i],a1),ch1)==0)//判断条件值所在行
{
n=0;
j=0;
strcpy(b5,b2[i]);//提取条件值所在行
while(b5[j]!
='\0')//扫描所在行
{
while(b5[j]!
=',')
{
if(b5[j]=='\0')
{
j--;
break;
}
b3[n][k]=b5[j];
//将其以单个数据为单位,存入另一个二维数组,每行对应一个数据,这样方便对串处理
j++;
k++;
}
b3[n][k]='\0';
n++;
k=0;
j++;
strcpy(b3[n],"$");
strcpy(b3[a2],ch2);
//将要修改的值直接覆盖到要修改的数据位置
}
n=0;
while(strcmp(b3[n],"$")!
=0)
{
strcat(b4,b3[n]);
strcat(b4,",");
n++;
}//修改完成,把二维数组连回一维数组
strcpy(b2[i],b4);
//并将其覆盖到原数据条件值所在行,完成第一次
}
i++;//进行第二行比较,直到结束
}
f1=fopen(ch,"w");
i=0;
while(strcmp(b2[i],"$")!
=0)//将修改后的数组覆盖写回原数据文件
{
fputs(b2[i],f1);
fputc('\n',f1);
i++;
}
fclose(f1);
printf("数据已修改!
\n");
}
voidsjsy(chara[],chara1[],intb1)//数据索引
{
FILE*f1;
charb3[200][200],b,b2[200][200],b4[200];
inti=0,n=0,j=0;
f1=fopen(a,"r");
b=fgetc(f1);
while(b!
=EOF)//原数据读入内存,二维数组
{
while(b!
='\n')
{
b2[i][j]=b;
b=fgetc(f1);
j++;
}
b2[i][j]='\0';
i++;
j=0;
b=fgetc(f1);
}
strcpy(b2[i],"$");//加结尾符
fclose(f1);
f1=fopen(a1,"w+");
i=0,n=0;
while(strcmpi(b2[i],"$")!
=0)
{
strcpy(b3[i],dhctq(b2[i],b1));
//将索引值所在列的第一个索引值赋给二维数组第零行
n=i;//记录索引值所在原数据的位置
strcat(b3[i],",");
itoa(n,b4,10);//将其位置由整形转换为字符串
strcat(b3[i],b4);//将其连到索引值后面,形成索引域值
strcat(b3[i],",");
i++;//进行下一个索引值处理
}
strcpy(b3[i