数据库的最简单实现

转载自  数据库的最简单实现

所有应用软件之中,数据库可能是最复杂的。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协议操作数据库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324332.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Raft协议安全性保证

分布式系统中主要的问题就是如何保持节点状态的一致性,不论发生任何failure,只要集群中大部分的节点可以正常工作,则这些节点具有相同的状态,保持一致,在client看来相当于一台机器。 一致性问题本质就是replicated sta…

2021,春节联欢会

今天,3班和4班都组织了春节联欢会,每个节目都是有同学们精心准备的,非常非常的精彩。 上午,搬着电脑去上课的时候,发现黑板上已经被红红的彩带占上了,估计学生们这时候的心理就是,应该不能上课了吧。然后我就在“众目睽睽”下拆下来,将投影仪幕布放下来继续上课,哈哈哈…

网关过滤

内置网关过滤 自定义过滤

你,的寒假作业写多少了?

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。一晃寒假已过10多天,亲爱的同学们,你的寒假作业写多少了?是一点都没动呢还是多少动了点了?昨天晚上在3班的群里发了几套课程,刚发就有几位同学…

MassTransitamp;amp;Sagas分布式服务开发ppt分享

saga,与分布式相关,最早被定义在Hector Garcia-Molina和Kenneth Salem的论文"Sagas"中。这篇论文提出了一个saga机制来作为分布式事务的替代品以解决长时间运行的分布式事务(long-running process)的问题。这篇论文认为…

全局过滤器

自定义全局过滤器

最长回文子串(Longest Palindromic Substring)

转载自 最长回文子串(Longest Palindromic Substring)——三种时间复杂度的解法 子串:小于等于原字符串长度由原字符串中任意个连续字符组成的子序列 回文:关于中间字符对称的文法,即“aba”(单核)、“cabbac”(双核)…

小白入门级的视频剪辑软件

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。前言昨天,给班级群里面分享了个视频剪辑软件——剪映PC端,并交代同学们,剪辑视频可以以它来入手,我大致的看了看,PC端的剪映功能基本上能满足…

DDD理论学习系列(12)-- 仓储

1. 引言 DDD中Repository这个单词,主要有两种翻译:资源库和仓储,本文取仓储之译。 说到仓储,我们肯定就想到了仓库,仓库一般用来存放货物,而仓库一般由仓库管理员来管理。当工厂生产了一批货物时&#xf…

Windows 通过 SecureCRT 8.x 上传文件到Linux服务器

转载自 Windows 通过 SecureCRT 8.x 上传文件到Linux服务器 1、SecureCRT 连接 Linux 服务器,这一步操作简单: 2、连接并登录成功后,直接在连接成功的页签上 右键 -> Connect SFTP Session 打开SFTP窗口: 3、在新的SFTP页签…

没有回家的等于没过年

大家好,我是雄雄,欢迎关注公众号【雄雄的小课堂】。今天是农历2021年正月初二,新的一年,祝大家牛年大吉,身体健康,万事如意!今年由于各方面原因并未回家过年,感觉没回家等于没过年&a…

.NET Core引入性能分析引导优化

“性能分析引导优化(Profile Guided Optimization,缩写PGO)”是一项原生编译技术,可用于生成高度优化的代码。它通过一个两步编译过程实现优化——用第一步记录相关执行信息,然后第二步用那些信息构建一个改进过的二进…

手把手教你搭建Maven项目

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。今天给大家分享的是“手把手教你买基金”,奥!!不对,不好意思,是“手把手教你使用idea搭建Maven项目”!前言大家都知道&#x…

实例!使用Idea创建SSM框架的Maven项目

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。前言书接前文,昨天带着大家下载且配置了maven,以及在idea中创建maven项目,今天,我们就结合ssm框架,在idea中实现一个增删改查案例。昨天的…

如何给你的Idea换一个好看漂亮的主题

大家好,我是雄雄,欢迎关注微信公众号【雄雄的小课堂】。前言大家都知道,idea里面自带两种主题样式,一种是灰色的,另一种是黑色的。你有没有想过换个其他的主题颜色用用呢?如果想,那么今天&#…

腾讯游戏使用Microsoft Service Fabric案例

本文转载自公众号-云就该这么玩,微软官方的地址链接:https://customers.microsoft.com/en-us/story/tencent-telecommunications-azure-service-fabric-windows-server-en 根据研究公司Newzoo的报告估计,全球游戏收入在2017年将达到1080亿美…