赞
踩
进入IT这一行也有几个年头了,该听闻的技术,大都没有遗漏,所以广度上的扩展,不太急迫了,但深度上的扩展,还有很多要做的工作,所以就觉得从 “造轮子” 这方面切入,慢慢扩展自己的深度了。
借助于实现一个数据库,笔者主要的目的有三个:
1.深入了解一个数据库的底层原理,以及要从零实现的话,要包含哪些模块,如何实现
2.这次实现的数据库是玩具级别的,几乎不需要测试我就能知道其具有非常多的缺陷,性能也很低,但这次实现是为以后实现更为复杂的轮子做准备,比如实现一个分布式数据库,GPU数据库等等。
3.强化python的编程
可能有些读者会问,就算是造轮子,为什么选择造数据库?其实主要的原因有如下几个:
一来数据库是IT界历史悠久,非常常见的产品,其底层凝聚了计算机发展以来的很多精华思想,比如性能优化啊,通信协议啊(如果数据库是分布式的话)等等。因此,如果真的从零实现一个数据库的话,肯定对数据结构,搜索算法,计算机网络这些知识更为精通,这对自己的技术成长有很多的帮助;
二来,笔者是一个算法工程师,尤其接触非常多的大数据业务场景,所以会很在意"性能"有关的东西。所以,杠数据库对笔者来说,既能培养算法能力,又能提高自己对”性能“的理解,做得知其然知其所以然。
目前代码笔者放于Github仓库上了,有兴趣的读者可以去clone下来,自己测试一下,更有兴趣的,可以拆了轮子,重新造一个。我的微信:jiedemaikena,有兴趣可以多多交流。
首先,直接贴图,直观感受一下:
clone数据库下来后,运行test4.py:
运行test3.py:
基本的增删查改,笔者是实现了,操作起来跟MySQL差不多,实际上几乎就是按着MySQL的操作习惯造出来的。
认真负责的说,笔者实现的数据库仅仅是达到能用的水平(因为存储是基于python的list,可想而知速度有多慢)!跟MySQL这些,没得比的(实际上这个项目是为了练手,为以后实现一个更为靠近MySQL的数据库做准备)
目前数据库有的性能:
目前,支持增删查改的命令如下:
增:INSERT INTO table_name (列1, 列2,…) VALUES (值1, 值2,…)
删: DELETE FROM 表名称 WHERE 列名称 = 值
更新:UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值
查:SELECT 列名称 FROM 表名称 WHERE 列名称 = 值
where后面的条件判断可以是 (>,>=,<.<=,!=,=,like,range(…),in,not in)
数据库目前没有实现的东西:
可能还有一些核心模块笔者没有写,但笔者实现的数据库,缺少的这些模块,才是数据库真正的灵魂,目前笔者知识水平有限,就先搁置了,但以后肯定会来挑战的。
首先来看一张图:
database,table,字段(Field)这三个概念完全对应着MySQL中的概念:进入MySQL后,要选择一个数据库(database),然后数据库中有多个table,每个table有很多列字段(Field)。
说了这么多,还是要回到怎么编写这轮子的第一句代码中?很多人可能听到要从零实现一个数据库,感觉代码量大的不行,非常难,完全不知道从哪下手。其实只要好好理清造数据库,最起码有哪几个板块就可以了。
首先要实现一个Field模块,即要编写一个类,这个类能够总结好Field应该有什么特性:
之后要实现Table模块,Table直接的处理对象不再是某个值,而是Field,就是说,就算是增删查改,Table模块也是基于Field模块完成,因此需要满足:
在这时,需要实现一个很核心的函数 __parse_conditions,其作用是,得到被删查改的条件。
然后到database模块了,其操作对象变成了Table了,因此需要满足:
Field,Table,Database这三者就是数据库的核心了。但用户对数据库的操作不是直接操作这三个类,而应该有个专属的操作类,这个操作类直接操作这三个对象(严格来说,是操作database模块,然后由database模块往下调用),这个操作类叫做Engine模块。
除此之外,Engine模块还负责SQL命令行交互的实现,所以,这个轮子中,最核心的部分就是Engine模块。
Engine模块需要满足的功能:
既然说到了输入SQL,比如输入select * from t_test where f_id = 1,where之后的部分,我们可以称之为筛选条件,这个部分笔者用了一个parser模块来实现,并且为了支持parser解析的功能,还需要一个条件判断case模块。
暂时就写这么多吧,如果以后有东西要补充的话,慢慢写。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。