`

数据库的最简单实现

 
阅读更多

作者: 阮一峰  http://www.ruanyifeng.com/blog/2014/07/database_implementation.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-tree

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协议操作数据库。

(完)

相关文章

  • 2014.11.11: 编译器的工作过程
    源码要运行,必须先转成二进制的机器码。这是编译器的任务。
  • 2014.09.07: 数据压缩与信息熵
    1992年,美国佐治亚州的WEB Technology公司,宣布做出了重大的技术突破。
  • 2013.11.29: Stack的三种含义
    学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。
  • 2013.10.14: 为什么寄存器比内存快?
    计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。
分享到:
评论

相关推荐

    GreenDao数据库简单的实现代码

    总之,GreenDao提供了一个简单易用的API,使得Android开发者可以高效地处理SQLite数据库。通过定义实体类、生成访问层代码、初始化数据库以及调用Dao接口,可以轻松完成数据的CRUD操作。在实际项目中,合理利用...

    php连接mysql数据库最简单的实现方法

    在连接MySQL数据库之前,您必须指定以下信息: MySQL数据源名称或DSN:指定MySQL数据库服务器的地址。您可以使用IP地址或服务器名称,例如,127.0.0.1 或 localhost MySQL数据库名称:表示要连接的数据库的名称。 ...

    andriod数据库简易实现

    本文将深入探讨如何在Android中简单实现一个用于存储账号密码的数据库,并介绍与之相关的数据获取技术。 首先,Android系统支持SQLite数据库,这是一种轻量级的、嵌入式的关系型数据库,适合移动设备上的应用。要...

    ado编程实现的客户信息管理系统(最简单的数据库实现方法)

    本系统——“ado编程实现的客户信息管理系统”就是一种采用最简单数据库实现方法的例子,它利用了ADO(ActiveX Data Objects)技术来与SQL Server数据库进行交互。下面将详细介绍ADO编程以及其在构建客户信息管理...

    C# WinForm DataGridView同步更新数据库 TreeView最简单的绑定数据库

    本教程将深入探讨如何实现`DataGridView`与数据库的双向同步更新,并使用`TreeView`进行简单的数据库绑定。 首先,我们需要理解`DataGridView`控件。它是Windows Forms中的一个表格视图,用于显示数据集或数据源中...

    .net数据库 实现简单的学生成绩管理

    在.NET框架下实现一个简单的学生成绩管理系统,通常涉及到多个技术层面,包括数据库设计、编程语言使用、数据访问层的构建以及用户界面的设计。这里主要围绕.NET和数据库这两个核心元素展开,结合VS2010这个开发环境...

    c语言实现简单数据库

    在本项目中,我们探讨的是如何使用C语言来实现一个简单的数据库系统。这个数据库系统具有基本的SQL操作功能,如SELECT、INSERT、CREATE以及DELETE,是哈工大软件设计课程中的一项实践任务,旨在帮助学生理解和掌握...

    基于hibernate的简单数据库实现

    **基于Hibernate的简单数据库实现** Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了方便的数据持久化服务,使得开发人员可以避免编写大量的SQL语句,从而更加专注于业务逻辑。通过Hibernate...

    ios数据库的简单运用

    这篇文档将深入探讨如何在iOS平台上简单地应用数据库。我们将主要关注SQLite,这是一个轻量级、关系型数据库,非常适合移动设备,包括iOS设备。 首先,我们要了解SQLite的基本概念。SQLite是一个嵌入式的SQL数据库...

    080426ADO连接数据库最简单的代码

    标题“080426ADO连接数据库最简单的代码”所指的内容,是关于使用ActiveX Data Objects(ADO)技术来实现与数据库的最基本连接。ADO是Microsoft开发的一个数据访问接口,它允许程序员通过简单的API调用来操作数据库...

    DELPHI的超简单数据库

    DELPHI的超简单数据库设计通常涉及基础的数据库交互,主要使用的是Delphi集成的数据库组件,如ADO(ActiveX Data Objects)或DBExpress。在本文中,我们将深入探讨如何在Delphi中创建一个基本的数据库应用,实现添加...

    Android储存---SQLite数据库的简单使用,实现增删改查

    在Android应用开发中,SQLite是一个重要的本地...通过上述步骤,开发者可以实现简单的数据库管理,满足基本的存储需求。在更复杂的应用场景下,可能需要结合其他数据管理策略,如Room库,以提高开发效率和代码质量。

    数据库实验报告(数据库的简单查询和连接查询 )

    实验报告——数据库的简单查询和连接查询 在本次数据库实验中,主要目标是掌握SQL语言的基础操作,包括创建数据库和表、修改表结构、插入和更新数据,以及进行有条件的数据查询。以下是实验的具体内容和步骤: 1. ...

    实现对mysql数据库的简单增删改查功能

    本文将深入探讨如何实现对MySQL数据库的简单增删改查(CRUD)功能,以及如何构建一个简单的登录功能和用户管理模块。 首先,让我们了解MySQL的基本操作。在SQL中,"Create"代表创建,用于建立数据库、表或索引;...

    数据库设计 简单个人通讯录的设计与实现

    在这个"简单个人通讯录的设计与实现"项目中,我们将深入探讨如何利用数据库技术构建一个实用且易于管理的个人联系人系统。 首先,我们需要理解数据库设计的基础概念。数据库设计包括需求分析、概念设计、逻辑设计和...

    简单的java与数据库之间的操作

    简单的实现增删改,适合初学者,无框架,简单的熟悉java与数据库的操作

    LabSQL对数据库访问的实现

    《LabSQL对数据库访问的实现》一文详细探讨了如何在LabVIEW环境下通过LabSQL这一免费、多数据库、跨平台的数据库访问工具包实现数据库访问。LabVIEW作为虚拟仪器系统开发的重要工具,以其可视化编程环境和强大的函数...

    java连接oracle数据库最简单例子

    这个"java连接oracle数据库最简单例子"提供了详尽的步骤和代码示例,非常适合初学者学习。以下是对这个主题的详细解释: 首先,Java通过JDBC(Java Database Connectivity)API与Oracle数据库进行交互。JDBC是Java...

    PHP 连接mysql数据库做简单的登录页面,实现用户的登录注册功能

    在PHP中,构建一个连接MySQL数据库的简单登录和注册页面是Web开发的基础步骤。下面将详细解释这个过程涉及的关键知识点。 首先,我们需要了解PHP和MySQL的连接方式。PHP通过mysqli或PDO扩展与MySQL进行交互。这里...

    数据库连接 数据库的简单连接

    本文将深入探讨数据库连接以及如何实现简单的数据库连接,主要以Java中的JDBC(Java Database Connectivity)为例进行讲解。 首先,数据库连接是应用程序与数据库系统之间建立的通信桥梁,允许数据的读取、写入和...

Global site tag (gtag.js) - Google Analytics