加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 安全 > 正文

从0开始打造一个最小系统的数据库

发布时间:2021-01-10 09:38:13 所属栏目:安全 来源:网络整理
导读:《从0开始打造一个最小系统的数据库》要点: 本文介绍了从0开始打造一个最小系统的数据库,希望对您有用。如果有疑问,可以联系我们。 本篇趟个雷,把数据库纳入到轮子中,在我看来,数据库比轮子复杂多了,是一个和操作系统差不多复杂度的东西,所以才能通过一个

总之,数据底层我们就用了一个定长的二进制文件和几棵B+树,再加上一个meta信息文件来实现了一个数据库的底层数据层,很简单哈,但基本上包括了数据库真实的底层,虽然真正的数据库比这复杂多了,但也跑不掉这几个数据结构,整个看下来,数据层的数据结构大体上长这样子.

当然,数据层实现完了以后,还需要对上提供几个简单的接口,比如:

  • 建表接口?CreateTable( []FieldInfo ),参数是每个字段的信息,包括字段的名称,长度,类型
  • 数据插入接口?AddData(map[string]string),参数是一个map,key是字段名称,value是字段内容
  • 单字段查询接口?Find(fieldname,fieldvalue,op),参数是字段名称,字段值,操作类型(大于,小于,等于)
  • 数据获取接口?GetData(docid),参数是docid,用来计算在文件中的偏移

查询层

底层已经有了,接下来就是上面的查询层(引擎层)了.这里我没用引擎两个字,是因为最小数据库的实现上,实在算不上一个引擎系统,我们实现最简单的基本查询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)

作者:吴坚

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读