
数据库课程设计文档.doc
19页20084001-周经辉-数据库课程设计0数据库系统原理课程设计文档学号: 20084001 姓名: 周经辉 20084001-周经辉-数据库课程设计1一、DBMS 的实现方式 四张基本表,以文本文档形式存储,分别是数据字典,用户表,关系属性表,关系数据表数据字典用来存储关系名,以换行符进行区别,建立索引时,在相应关系名后存储索引表名,以逗号进行区别,数据操作时,先查数据字典,是否有此关系名或相应索引表名,才能继续操作用户表用来存储用户信息,以逗号进行区别,第零列为用户名,第一列为用户口令,第三列为用户相应权限, “0”代表后台管理者,可以查询和添加用户, “1”代表数据库管理员,可以做增,删,改,查操作,但不能添加用户, “2”代表普通用户,只能做查询操作,用户登陆时,通过对用户名跟口令的匹配,返回第三列权限值关系属性表用来存储关系属性名,即列名,以逗号区别关系数据表用来存储关系数据,行内以逗号区别,行间以换行符区别二、DBMS 的功能介绍 (1)create table建立新关系,权限为 1(2)drop table删除关系,权限为 1(3)alter table20084001-周经辉-数据库课程设计2add 添加表属性,并添加相应属性数据,权限为“1”drop 删除表属性,权限为“1”(4)insert插入数据,以行为单位,权限为“1”(5)delete删除数据,以行为单位,权限为“1”(6)update修改数据,权限为 1(7)select查询操作,权限为“0” , “1”, “2”都可以(8)create index建立索引(9)drop index删除索引(10)create user添加用户,权限为“0”三、DBMS 算法实现算法描述20084001-周经辉-数据库课程设计3char* bdsctq(char a[],char b) 表达式串提取,根据第二参数为‘l’或‘r’ ,提取表达式左部或又部串char* ctq(char a[],int b)关键字串提取,根据字符个数提取关键字void dgxty(char ch1[],char c[],int b)单关系投影,参数为:关系属性表名,关系数据表名,20084001-周经辉-数据库课程设计4投影所在列void dgxxz(char ch[],char ch1[],char ch2[],char ch3[],char ch4[],int a1,int a2)单关系选择,参数为:关系数据表名,选择值 1,选择值 2,and 或 or,选择后生成表名,选择属性所在列1,所在列 2void dgxyhxz(char ch[],char ch1[],char ch2[],int a1)单关系优化选择,与上述函数类似,只不过上述函数比较两列,此函数只比较一列char* dhctq(char a[],int b) 根据逗号提取串,根据第 i 个逗号提取 i 到 i+1 间的串int gxcz(char z[],char a[])关系查找,根据关系属性表和属性名的匹配,返回此属性名所在的列数char* gxmtq(char a[],int b)新建模式关系名提取void gxxg(char p[],char a[])关系属性修改,根据关系属性表和属性名的匹配,并将其删除,保留其它属性20084001-周经辉-数据库课程设计5char* kgctq(char a[],int b) 根据空格提取串void lgxlj(char ch[],char ch1[],char ch2[],char ch3[],int a1,int a2,char ch4[],char ch5[])两关系连接,参数为:连接数据表 1,连接数据表 2,连接后生成的属性表名,连接后生成的数据表名,连接属性在原属性表列数 1,连接属性在原属性表列数 2,原属性表 1,原属性表 2。
三关系连接时两次调用void lgxsylj(char a[],char a1[],char a2[],char a3[],char a4[])两关系索引连接,参数为:连接数据表 1,连接数据表 2,索引表 1,索引表 2,连接后生成的数据表名char* lmtq(char a[])列名提取,提取括号内字符,数据插入时也可用void sgxty(char ch[],char ch1[],int a,int a1,int a2)三关系投影,参数为:投影属性表名,投影数据表名,三个属性所在列void shop1(char a[]) 属性表文件输出void shop2(char a[]) 数据表文件输出20084001-周经辉-数据库课程设计6void sjsc(char ch[],char ch1[],int a1)数据删除,参数为:数据表名,所要删除的数据值,所要删除值所在的属性列void sjsy(char a[],char a1[],int b1)数据索引,参数为:要建索引的原数据表名,索引表名,要建索引的数据所在列void sjxg(char ch[],char ch1[],char ch2[],int a1,int a2)数据修改,参数为:所要修改的数据表名,修改的判断属性值,要修改的值,修改的判断属性所在列,要修改的属性所在列void tjsxsjxg(char ch[])添加相应数据,添加属性时调用,在相应数据表里添加一列新数据,对应新属性char* yhpp(char ch[],char ch1[])用户匹配,参数为:用户名,用户口令,匹配成功后,以字符串形式返回其相应权限void yhty(char ch[],char ch1[],int a1,int a2,int a3,char ch3[],char ch4[])优化投影,参数为:属性表名,数据表名,投影的三个属性所在列,投影后生成的属性表名,生成的数据表名20084001-周经辉-数据库课程设计7void zdcrxg(char a[])字典插入修改,新建关系时,修改字典内容int zdcz(char a[])字典查找,查找关系名是否存在,存在,返回“0”,否则返回“1”void zdsysc(char a1[])字典索引删除,删除索引时,修改字典内容void zdsyxg(char a1[],char a2[])字典索引修改,添加索引时,修改字典内容void zfsr(char a[]) 字符输入,以分号为结束标志,输入有回车时,转换为空格处理,当检测到有多空格时,只保留一空格程序流程图附下页20084001-周经辉-数据库课程设计820084001-周经辉-数据库课程设计9用户登录匹配?权限为 0? 权限为 1?添加用户增,删,改,操作查询操作权限不够权限不够输出结果成功添加,修改相应表操作成功,生成,删除,修改相应表#键结束继续操作?权限返回YYYYNNNN图 1.1 算法流程20084001-周经辉-数据库课程设计10四、实验测试用例与结果 注:篇幅所限,只列举一些操作用例,具体功能可运行程序测试数据字典和三张要操作的基本表:以 user1 管理员登陆:管理员权限可进行的相应操作:20084001-周经辉-数据库课程设计11建表,插入数据:修改数据:添加属性:20084001-周经辉-数据库课程设计12删除数据:查询,多关系,多条件的连接,选择,投影操作:查询优化,执行结果与上述一致:下页续…20084001-周经辉-数据库课程设计13建立索引,第一列为索引数据,第二列为索引域值:实现索引上的连接,连接后的数在索引属性上据是有序的:以后台管理员登陆,可以添加用户:20084001-周经辉-数据库课程设计14五、关键技术 注:列举两个较关键,比较难一点的处理函数void sjxg(char ch[],char ch1[],char ch2[],int a1,int a2)//数据修改{FILE *f1;char b,b2[200][200],b3[50][50],b4[200],b5[200];int i=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)//判断条件值所在行{20084001-周经辉-数据库课程设计15n=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]);20084001-周经辉-数据库课程设计16strcat(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");}void sjsy(char a[],char a1[],int b1)//数据索引{FILE *f1;char b3[200][200],b,b2[200][200],b4[200];int i=0,n=0,j=0;f1=fopen(a,"r");b=fgetc(f1); while (b!=EOF)//原数据读入内存,二维数组{while (b!='\n')20084001-周经辉-数据库课程设计17{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],"$");i=0;while (strcmpi(b3[i],"$")!=0)//进行索引值排序,以整行字符串进行处理{j=i+1;20084001-周经辉-数据库课程设计18while (strcmpi(b3[j],"$")。
