MySql系统设计.docx
《MySql系统设计.docx》由会员分享,可在线阅读,更多相关《MySql系统设计.docx(21页珍藏版)》请在冰豆网上搜索。
MySql系统设计
④
开始界面,及各个语句的反馈信息
SQL语句解析内部
SQL语句解析用户部分
*Select查找记录
Update更新记录
Delete删除记录
Alter修改属性
Create创建.dbf表
③
图表
(1),解析系统的逻辑处理结构。
注释说明:
1读取,写入数据库。
调用Create语句,创建符合条件的dbf文件,存入数据库,或读取文件,修改表单属性。
2读取,写入数据库。
从数据库中读取表单,修改表中记录,再写入库中。
3只读取数据库。
读取选择相关信息,反馈给用户。
④底层数据库为上层用户界面提供反馈信息
2.2系统文件构成分析
图表
(2),解析系统的文件结构
程序文件
文件概述
MySql.c
主程序文件,包括main主函数在内,以及对各个语句的判断
Sql.c
包括所有的sql语句处理函数,前期的读入,词句分析函数,以及分析后调用函数处理文件
Dbf.c
包括所有对.dbf文件的创建,修改,删除等的函数
Sql.h
Sql语句处理函数的定义
Dbf.h
处理文件的函数的定义
演示文档
对初学者的提示,以及异常输入的演示
2.3系统总体流程分析
图表(3),程序的主要执行流程
程序开始,显示界面,读入用户输入,存入sql数组并进行判断便于后序的分析处理
处理order语句,讲元组存入select文件,然后筛选需要的信息输出
读取错误,返回
Insert插入记录
本小组主要完善了select语句,故在此不做其他语句的详细分析
不符合输入条件,直接返回上级
不是Y也不是N,则继续询问
2.4系统基本设计概念
1)系统总体设计分析:
系统解析了sql语句,包括对表的创建,删除,对表内记录的插入,删除等。
其中:
(1)表定义中列(属性)的类型至少支持三种(integer、char、float);
(3)记录的插入、删除、修改等,即时更新原始数据;
(4)记录的搜索至少实现按主键查找,只是主键上的范围查找,包含遍历。
2)本次select语句的模块完善分析和结构分析
(1)增加了groupby语句,可以处理groupby语句的各个条件,包括having语句或和orderby连接使用;
(2)完善了order的排序模块,从单属性排序优化到了多属性排序;
(3)SortGroupRec()优化了内部排序,加快了大数据处理速度;
2.5程序模块说明
2.5.1Main()模块
1)目标:
协调各其他各模块之间的关系,最终负责系统运行
2)程序文件:
MYSQL.c
3)主要数据结构:
字符串(用来存储用户的输入数据)
4)调用的其他模块:
文件处理模块(dbf),处理操作模块(sql)
5)算法:
c面向过程的函数处理机制
6)逻辑流程图:
intmain()
{
Show();//界面构造
Getsinput();//得到用户输入,存储
Switch()
{
caseCREATE:
Create(...);break;创建记录
caseSELECT:
Select(...);break;选择记录
caseINSERT:
Insert(...);break;插入记录
caseUPDATE:
Update(...);break;更新记录
caseDELETE:
Delete(...);break;删除记录caseSELECT:
Select(...);break;查询记录
caseQUIT:
return;
}
Judge();//判断用户是否继续操作,继续或者结束程序
Return0;
}
1其中界面和读取操作算是前期的处理,属于数据的初始化阶段;
2Switch属于对输入的判断,然后在其函数体内执行操作,属于本函数的主要组成部分,语句select是本组这次设计的重点完善对象;
2.5.2数据操作处理模块
1)目标:
完成对底层数据的各种操作,方便上层的调用,简化操作
2)程序文件:
dbf.cdbf.h
3)主要数据结构:
以结构体为主
struct_DbfHead
{
chardbFlag;
charyear;
charmonth;
charday;
intrecCounts;
shortfirstRecAddr;
shortrecLen;
charundo[20];
};
typedefstruct_DbfHeadDbfHead,*pDbfHead;
//字段描述结构体定义
struct_FieldDcp
{
charfieldName[10];
charundo1;
charfieldType;
shortoffset;
charundo2[2];
charfieldLen;
charnumDecis;
charundo3[14];
};
typedefstruct_FieldDcpFieldDcp,*pFieldDcp;
//字段数据结构体定义
struct_DbfField
{
char*fieldData;
charfieldName[10];
charfieldType;
charfieldLen;
charfieldDcis;
shortoffset;
};
typedefstruct_DbfFieldDbfField,*pDbfField;
//记录结构体定义
struct_DbfRec
{
chardelFlag;
DbfFieldfield[MAX_FIELD_COUNTS];
intrealCounts;
};
typedefstruct_DbfRecDbfRec,*pDbfRec;
//dbf文件句柄定义
struct_DbfHand
{
charfilename[50];
DbfHeadheader;
DbfRecrec;
longcurRecNo;
longcurFpAddr;
FILE*fd;
};
typedefstruct_DbfHandDbfHand,*pDbfHand;
同时也在dbf.h中进行了一些宏定义,方便其它函数直接使用:
#defineGET_YEAR0
#defineGET_MONTH1
#defineGET_DAY2
#defineFOX_VERISON_INFO262
#defineWIN_32
#defineMAX_FIELD_COUNTS40
//字段类型
#defineFIELD_CHAR_TYPE0x43
#defineFIELD_DATE_TYPE0x44
#defineFIELD_FLOAT_TYPE0x46
#defineFIELD_LOG_TYPE0x4C
#defineFIELD_MEMO_TYPE0x4D
#defineFIELD_NUMIC_TYPE0x4E
#defineFIELD_INT_TYPE0x49
//条件查询
#defineCON_SMALL0
#defineCON_EQUAL1
#defineCON_LARGE2
//排序
#defineCON_SORT_INCREASE0
#defineCON_SORT_DECREASE1
#defineTRUE1
#defineFALSE0
#defineBOOLint
4)调用的其他模块:
无
5)算法:
C语言面向过程的设计
*2.5.3解释器模块
(由于本组只完善修改了数据查询语句,所以在这里只分析select语句,其他模块只简单阐述,不再仔细分析)
1)目标:
命令解释器的基本功能就是将用户的输入命令进行语法分析和语义解析并得到需要的命令参数,最后根据命令参数对底层数据进行操作。
2)程序文件:
sql.h、sql.cpp
3)主要数据结构:
有意字符串,一个以回车或空格或标志符来分割的有独立含义的字符串(不包括空格,回车,但标志符入“;”视作有意字串,如一条命令。
4)调用其他模块:
数据操作处理模块。
5)算法:
排序算法(内部和外部)
6)模块内部详细分析(select语句解释模块,intSql_SELECT())
(1)首先判断第一个操作是否是select
for(i=0;sql_select[i]=='';i++);//处理输入的空格,以后每次读入都会有这个语句
for(;sql_select[i]!
='';i++)
{
sn[i]=tolower(sql_select[i]);//将语句转化成小写,存入sn
t++;
}
sn[t]='\0';//结束符,表示字符串结束
然后,strcmp(sn,“select”),如果是select,则继续后续的读入处理分析,否则,返回。
(2)读取select后的字符串,即所要查询的属性,存入s[][]中。
Do{
t=0;
snum++;//代表select后的属性的数量
for(;sql_select[i]=='';i++);//处理输入中的多余的空格
for(;sql_select[i]!
='';i++)
{
s[snum][t]=tolower(sql_select[i]);//转化成小写字符
t++;
}
s[snum][t]='\0';//结束符,表示这个属性结束
if(s[snum][t-1]==';')//如果遇到“;”字符,表示输入结束,break跳出
{
break;
}
if(strcmp(s[snum],"from")==0){
//如果遇到from字符串,则表示select结束,break跳出读取from后的表的信息
break;
}
}while
(1);//循环处理读取字符串,直到以上两种情况,结束
然后判断是否有查询聚集函数:
for(p=0;p比较判断是哪个聚集函数,在这里以count为例说明执行过程
if(strcmp(s[p],"count")==0)
{
cnum++;//记录count的数量
if(strcmp(s[p],"*"))//判断count后是否有*
{
sign=1;//标记含有*
strcpy(st,s[p+1]);//记录在st串中
st[strlen(s[p+1])]='\0';//结束符
}
else//同上,没有*的情况
{
strcpy(st,s[p+1]);
st[strlen(s[p+1])]='\0';
sign=2;
}
strcpy(st_g[cnum-1],s[p+1]);
}
数据测试:
(3)依次读取where,group,having,order等后面的属性,分别存入w[][],g[][],h[][],o[][]数组,方法同上在这里不在重复。
注意,在读取from后面的所要查询的表的信息时,在后面加上.dbf方便后期的查询
f[fnum]