自己实现一个最简单的数据库

July 4th , 2016

转载 codeceo 原文连接:http://www.codeceo.com/article/most-simple-database.html

所有应用软件之中,数据库可能是最复杂的。

MySQL的手册有3000多页,PostgreSQL的手册有2000多页,Oracle的手册更是比它们相加还要厚。

但是,自己写一个最简单的数据库,做起来并不难。Reddit上面有一个帖子,只用了几百个字,就把原理讲清楚了。下面是我根据这个帖子整理的内容。

一、数据以文本形式保存

第一步,就是将所要保存的数据,写入文本文件。这个文本文件就是你的数据库。

为了方便读取,数据必须分成记录,每一条记录的长度规定为等长。比如,假定每条记录的长度是800字节,那么第5条记录的开始位置就在3200字节。

大多数时候,我们不知道某一条记录在第几个位置,只知道主键(primary key)的值。这时为了读取数据,可以一条条比对记录。但是这样做效率太低,实际应用中,数据库往往采用B树(B-tree)格式储存数据。

二、什么是B树?

要理解B树,必须从二叉查找树(Binary search tree)讲起。

二叉查找树是一种查找效率非常高的数据结构,它有三个特点。

(1)每个节点最多只有两个子树。

(2)左子树都为小于父节点的值,右子树都为大于父节点的值。

(3)在n个节点中找到目标值,一般只需要log(n)次比较。

二叉查找树的结构不适合数据库,因为它的查找效率与层数相关。越处在下层的数据,就需要越多次比较。极端情况下,n个数据需要n次比较才能找到目标值。对于数据库来说,每进入一层,就要从硬盘读取一次数据,这非常致命,因为硬盘的读取时间远远大于数据处理时间,数据库读取硬盘的次数越少越好。

B树是对二叉查找树的改进。它的设计思想是,将相关数据尽量集中在一起,以便一次读取多个数据,减少硬盘操作次数。

B树的特点也有三个。

(1)一个节点可以容纳多个值。比如上图中,最多的一个节点容纳了4个值。

(2)除非数据已经填满,否则不会增加新的层。也就是说,B树追求”层”越少越好。

(3)子节点中的值,与父节点中的值,有严格的大小对应关系。一般来说,如果父节点有a个值,那么就有a+1个子节点。比如上图中,父节点有两个值(7和16),就对应三个子节点,第一个子节点都是小于7的值,最后一个子节点都是大于16的值,中间的子节点就是7和16之间的值。

这种数据结构,非常有利于减少读取硬盘的次数。假定一个节点可以容纳100个值,那么3层的B树可以容纳100万个数据,如果换成二叉查找树,则需要20层!假定操作系统一次读取一个节点,并且根节点保留在内存中,那么B树在100万个数据中查找目标值,只需要读取两次硬盘。

三、索引

数据库以B树格式储存,只解决了按照”主键”查找数据的问题。如果想查找其他字段,就需要建立索引(index)。

所谓索引,就是以某个字段为关键字的B树文件。假定有一张”雇员表”,包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应第几条记录,然后再从表格中读取。

这种索引查找方法,叫做“索引顺序存取方法”(Indexed Sequential Access Method),缩写为ISAM。它已经有多种实现(比如C-ISAM库和D-ISAM库),只要使用这些代码库,就能自己写一个最简单的数据库。

四、高级功能

部署了最基本的数据存取(包括索引)以后,还可以实现一些高级功能。

(1)SQL语言是数据库通用操作语言,所以需要一个SQL解析器,将SQL命令解析为对应的ISAM操作。

(2)数据库连接(join)是指数据库的两张表通过”外键”,建立连接关系。你需要对这种操作进行优化。

(3)数据库事务(transaction)是指批量进行一系列数据库操作,只要有一步不成功,整个操作都不成功。所以需要有一个”操作日志”,以便失败时对操作进行回滚。

(4)备份机制:保存数据库的副本。

(5)远程操作:使得用户可以在不同的机器上,通过TCP/IP协议操作数据库。

来自:阮一峰的博客

自己实现一个最简单的数据库相关推荐

  1. oracle简易数据库搭建,Oracle 10g 手工创建一个最简单的数据库

    [root@blliu ~]# su - oracle [oracle@blliu ~]$ cd $ORACLE_HOME/dbs [oracle@blliu dbs]$ touch initorcl ...

  2. 自己实现一个简单的数据库

    How do you build a database? (self.Database) How do you build a database? (self.Database) Its a grea ...

  3. Go语言从0到1实现最简单的数据库!

    导语 | 后台开发对于数据库操作是必不可少的事情,了解数据库原理对于平常的工作的内功积累还是很有帮助的,这里实现一个最简单的数据库加深自己对数据库的理解. 一.go实现数据库目的 了解数据是如何在内存 ...

  4. 一个简单的数据库工具类

    为什么80%的码农都做不了架构师?>>>    接上面一片博文,自己弄了一个简单的数据库操作工具类: /** 创建日期 2014-6-5** TODO 要更改此生成的文件的模板,请转 ...

  5. calcite连接mysql_如何使用Calcite实现一个简单的数据库

    说道Calcite你可能有些陌生, 但提及Hive.Kylin.Apache Drill.Flink等一定不会陌生,这些都是在我们日常工作中经常用到的,如上这些都是基于Calcite实现查询引擎,还有 ...

  6. 大学生数据库课程设计之学生选课系统(一个超级简单的系统)

    大学数据库课程设计–一个简单的学生选课系统 一.系统简介 一个超级简单的学生选课系统,使用Windows窗体设计界面,使用C#语言实现各种功能,数据库使用的是SQL.由于时间原因,做的非常仓促,系统中 ...

  7. 欢迎大家讨论:只想要一个最简单的XXX系统,功能最简化的XXX系统

    我们国人总有一种思想,能简化的简化,但是往往我们把真正应该简单化的东西反而没简单化,例如我们的人际关系.一些比较传统的封建思想,往往这些最应该简化的东西是更加搞得深入.复杂. 其实很多东西是简化不来的 ...

  8. 计划实现一个开源的KV数据库——Simple DB

    实现一个开源KV数据库的想法来源于对目前项目中所使用的K-V数据库使用情况的不满意. 先介绍一下我们的目前项目,作为本文的背景: 较为底层的分布式运行平台,使用C/C++实现的Actor模型(异步消息 ...

  9. 数据库内核杂谈 - 一小时实现一个基本功能的数据库

    我们摒弃直接介绍数据库内核各个模块的思路,而是从应用开发者的角度出发,来看实现一个数据库需要哪些基本功能,然后把这些功能细分成最小的模块再手把手一起实现. 对与应用开发者而言,一个数据库需要哪些必要的 ...

最新文章

  1. linux nfs如何配置,Linux上的NFS如何配置?
  2. Algorithms_二叉树的前序遍历、中序遍历、后续遍历(深度优先)
  3. python实现第一个web_我的第一个python web开发框架(6)——第一个Hello World
  4. node创建web静态服务
  5. 图解Reformer:一种高效的Transformer
  6. 超融合架构的优缺点_知道 超融合基础架构吗
  7. 微信看一看强化学习推荐模型的知识蒸馏探索之路丨CIKM 2021
  8. Ubuntu下反编译apk源码查看
  9. '用户 'sa' 登录失败。该用户与可信 SQL Server 连接无关联,做JSP项目连接数据库 ....
  10. 64位plsql连接oracle,PLSQL Developer连接Oracle11g 64位数据库配置详解(转)
  11. 考研数学模拟题要选哪个当真题做
  12. 英文垃圾邮件分类机器学习篇——带你一次看个爽
  13. css折角的简单实现 真实项目实践
  14. mysql导入的数据放在那个文件夹下_mysql数据库文件导入
  15. 沈阳农业大学计算机水平测试,沈阳农业大学(专业学位)计算机技术考研难吗
  16. java实现空心三角形
  17. 德勤技术咨询 oracle,【内推】德勤急招Oracle/SAP功能、开发顾问,Siebel顾问,BI顾问,IT审计顾问...
  18. 微信支付的架构到底有多牛?
  19. scratch3.0-界面介绍
  20. 通达信l-2服务器文件,分享两个手机版通达信的指标源码(PC端也适用)

热门文章

  1. 天堂向左,六级考场向右
  2. Linux Bash 笔记
  3. 1071 mysql_mysql 出现1071错误怎么办
  4. move std 函数 示例_确保(值类型)可拷贝类有默认构造函数
  5. LOJ 3094 「BJOI2019」删数——角标偏移的线段树
  6. 在.NET中使用脚本引擎
  7. 把《c++ primer》读薄(4-2 c和c++的数组 和 指针初探)
  8. restful,RESTful API 设计,GET/PUT/DELETE/POST
  9. MySQL高可用之mysql-mmm环境搭建
  10. ThinkPHP源码阅读1-------访问流程