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

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

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

《从0开始打造一个最小系统的数据库》要点:
本文介绍了从0开始打造一个最小系统的数据库,希望对您有用。如果有疑问,可以联系我们。

本篇趟个雷,把数据库纳入到轮子中,在我看来,数据库比轮子复杂多了,是一个和操作系统差不多复杂度的东西,所以才能通过一个Oracle养活一家全球50强的公司.本文为后端轮子系列的第一篇,我们先来谈谈如何造个数据库吧.

先来聊聊关系型数据库

关系型数据库(Relational Database)是一个伟大的发明,一般的数据库理论,大概会分成以下三个部分.

  1. 首先,数据库是建立在关系模型基础上的,并且从理论上来讲,是有完备的数学模型,也就是集合代数来做支撑的,他把我们真实世界中的联系和实体抽象成了关系模型,并用这个发展出了数据库理论,这是数据库的理论基础.
  2. 其次,也有人通过这个关系模型,发明了SQL这种进行关系查询的编程语言,用来对这个关系型的数据集合进行操作.这个实际上给出了通过集合代数发展出来的关系型数据库怎么进行数据操作和检索的.
  3. 还有人,发展出了数据库设计的理论,也就是大家所熟悉的数据库三大范式【应该是5大范式】,用来教我们在实际场景中怎么设计一个数据库,几大范式实际上是把关系模型这个抽象的概念变成了几条规则,按照这几条规则去设计数据库,就能产生最少的数据冗余,最能体现出关系这个模型的核心.

我们发现,上面三个大的部分都是数据库的理论知识,其实并没有人告诉我们怎么来用代码实现一个数据库,因为科学家们认为实现它并不重要,那是工程师要考虑的事情,too simple,科学家只负责搞出理论,反正我们也不是科学家,那么我们就来做做工程师吧.

工程师眼中的数据库系统

既然是工程师,首先想到的就是如何来实现一个数据库了,一个标准的数据库主要会包含以下几个大的模块.

  • 底层的存储层,这个是必不可少的,是整个数据库的核心数据结构,也就是数据是如何保存的,一般提供最简单的原子增删改查.
  • 存储层上面就是引擎层了,这里会对底层的存储层进行各种组合型的操作用来满足查询的需求之类的,而且数据库的事务支持也在这一层,我们熟悉的innoDB就是一个数据库的存储引擎,他其实包含的就是这个引擎层和存储层了,引擎层提供对数据层的操作方法集合.
  • 在引擎层之上还有个SQL的解析层,主要用来对SQL语句进行解析,分析,优化了,然后把SQL语句转化成引擎层的接口,进行具体的数据操作.
  • 最上面就是对外的UI了,也就是用户交互层了,一般我们熟悉的就是网络交互了.

虽然看起来好像挺简单,就是这么三层,但是实际的数据库是非常非常复杂的,除了这些以外还有很多其他模块,比如用户权限管理、缓存模块、日志模块、备份模块等等,大家可以仔细去看看innoDB的书籍或者innoDB的代码,光一个binlog就特别麻烦.

其实要保存数据,搜索系统也能保存数据,而且检索起来更快,并且两者的底层数据结构其实差别不是很大,但为什么用数据库呢?因为数据库的核心是可靠,这个可靠就是考数据库的引擎层来保证的,完整的binlog记录,崩溃后完整的重放机制,数据双写,内存数据定时刷新到磁盘,所有的这些都是为了保证数据的可靠,不会丢失数据.

而上面说的每一个功能,都能单独的写一篇长文,所以说要实现一个数据库其实是很麻烦的,因为为了做到可靠,必然会有很多冗余的数据或者冗余的操作来保证可靠,但作为一个成熟的产品,还需要考虑到产品的性能,所以,如何既可靠又性能优良,就变成了一个衡量数据库好坏的标准,当然,在这两点上,目前没人能干过Oracle了.

最小系统的数据库

数据库如此之复杂,我们如何对它进行瘦身,来实现一个最小的数据库系统呢?我们可以从另外一个角度想想,就是我们拿数据库是干什么的?那就是存储和查询数据,如果这么来想的话,就能简单不少.

首先,我们知道数据库最重要的功能就是存储数据,那么底层的存储部分是不能少的;其次,存储的数据要提供查询功能,不然存了就没意义了,这也是不能少的;第三,需要提供一个对外的接口可以和用户交互,不然就既不能存也不能查了.

所以,一个最最基本的数据库至少应该包含数据层,查询层(引擎层)和UI(用户接口)层三层,那么我们就用几个简单的文件来实现这三层,完成一个最小的数据库吧.

存储层

数据库的基本单位是列,再上一级的基本单位就是表了,而且我们在建表的时候都会指定列的名称、类型、长度这三个最基本的属性,如果所有列都有这三个属性,那么其实我们是知道每一行数据最多有多少字节的.所以,我们可以设定没一行数据的长度都是定长的,那么整个表的长度也是定长的了,这样查询的时候可以根据行的长度进行快速定位数据,我们的最底层数据就是一个定长的表格了,每一列存储的时候就像下面这样,然后有个meta信息来存储列的属性:

这个看上去很简单吧?也容易实现吧,其实很多数据库也基本上确实是这么实现的,并不难理解吧?稍微注意一下的是每一列存储的时候,每个字段的前四个字节保存的是这个字段的实际长度,然后才是字段的实际内容,如果长度小于建表时的设定长度,那么有一部分空间是浪费掉的,虽然是浪费了,但还是值得的,因为可以让查询的时候省不少事.

这么下来,每行记录就是一个定长的,而一个数据库的表就是一个二进制文件了,但仅仅是这样还是不够的,因为这样结构,无论什么查询都需要扫描全表,依次进行判断,而我们在建表的时候都会建立索引,为了建立索引,我们还得实现一个B+树来存储索引,而B+树基本上是所有数据库的索引保存的数据结构,这里我们也有实现.

(编辑:辽源站长网)

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

推荐文章
    热点阅读