从0开始打造一个最小系统的数据库(2)
总之,数据底层我们就用了一个定长的二进制文件和几棵B+树,再加上一个meta信息文件来实现了一个数据库的底层数据层,很简单哈,但基本上包括了数据库真实的底层,虽然真正的数据库比这复杂多了,但也跑不掉这几个数据结构,整个看下来,数据层的数据结构大体上长这样子.
查询层底层已经有了,接下来就是上面的查询层(引擎层)了.这里我没用引擎两个字,是因为最小数据库的实现上,实在算不上一个引擎系统,我们实现最简单的基本查询SQL(建表SQL、插入数据SQL、单表查询SQL)的解析.在实际中,SQL的解析是一个异常复杂的工程,涉及到语法分析、预处理、优化查询等几个大的部分,因为SQL其实是一门编程语言,要解析一门编程语言,那么编译原理那一套基本上都会用得到. 这里我们换条路子,因为只实现三种简单的SQL语句,那么我们直接用正则和字符串的匹配来对SQL进行解析,解析完成以后变成一个个数据层的对外接口,建表和插入数据都比较简单,解析了SQL以后直接调用上面的第一和第二接口就行了. 数据查询的时候,对查询SQL的WHERE之后的部分,用了个小算法,就是逆波兰表达式来对WHERE之后的语句进行解析,变成一个栈结构来存储查询的内容,然后通过弹栈的方式一个一个调用接口三,并且对结果进行求交和求并的操作,最后得到结果以后,再依次调用接口四获取最后的结果.如果对逆波兰表达式不了解,那么请自行百度一下,很简单的,主要用在对四则运算的优先级的解析中. 查询层的输入输出很简单,他对外实际上只提供一个接口.ExecSqlSentence( Sql ) string,都是字符串,输入是一条条的SQL语句,输出是数据. UI层(用户接口层)对于用户的接口层就更加简单了,我们只需要提供一个TCP服务就行了,用分号来分割每次用户的输入,也就是说,我们telnet上我们这个数据库,然后输入SQL,数据库就会返回数据了. 具体实现我在github上建立了一个新的工程叫SparrowSys,麻雀工程,意思很明显,这是一个后端的麻雀,是最简单的后端轮子,目前我也已经提交了一部分代码,数据库的还没有写完,后面会补上的. 数据库的部分在src下的SparrowDB里面,很明显的看到里面有DataLayer,EngineLayer,NetLayer,对应的就是上面的三层,每层里面有一到两个文件,都很简单.目前DataLayer基本完成了,后面会把EngineLayer和NetLayer补上,后面的文章会说说使用,utils文件夹中是一些公共的东西,后面的其他轮子会用到的,比如B+树就在utils里面. 目前这个工程里面东西不多,不建议看,后面我补全以后会说明,欢迎大家提交你的实现来代替我的.接受任何pull request. 最近比较忙,没时间写代码,先放出文章,等代码补充完整了再说说测试效果.点击后面网址,可跳到github代码库.https://github.com/wyh267/SparrowSys 来源:西加加语言 订阅号(ID:XJJ267) 作者:吴坚 (编辑:ASP站长网) |