实现一个微型数据库

自己写一个简单的数据库,原理大概有以下几点:

  一、数据以文本形式保存

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

  为了方便读取,数据必须分为记录,每一条记录的长度规定为等长。

  举例:假定每条记录的长度是800字节,那么第5条记录的开始位置就在3200字节。

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

  二、关于B树

  要理解B树先需要理解二叉查找树

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

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

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

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

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

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

  B树的特点:

  (1)一个节点可以容纳多个值。

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

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

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

三、索引

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

  所谓索引,就是以某个字段为关键字的B树文件,假定一张“雇员表”,包含了员工号(主键)和姓名两个字段,可以对姓名建立索引文件,该文件以B树格式对姓名进行存储,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应的第几条记录,然后再从表格中读取。这种索引查找方法,叫做“索引顺序存取方法”,缩写为ISAM。它已经有多种实现,只要使用这些代码库,就能自己写一个最简单的数据库。

  四、高级功能

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

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

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

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

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

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

最新内容请见作者的GitHub页:http://qaseven.github.io/

时间: 2024-10-29 20:35:47

实现一个微型数据库的相关文章

arduino-基于Arduino单片机 要做个微型数据库 不知道如何下手啊

问题描述 基于Arduino单片机 要做个微型数据库 不知道如何下手啊 基于Arduino单片机 要做个微型数据库 不知道如何下手啊 解决方案 你的Arduino内存32k,也就是32768个字节.在这些字节里,你写一个数据文件还可以.做数据库的话,应该是太小了 sqlite算小的了.它的可执行文件(Linux),是619544字节.比你的内存大了将近20倍. 如果你需要的数据量不是很大的话,建议你直接写数据文件吧 解决方案二: 你可以去Arduino的开源社区上提问,那边更在行这方面.

一个操作数据库的Java Bean……

数据|数据库 一个操作数据库的Java Bean,有兴趣的朋友看一下吧~~ package dbconnect; import java.sql.*; public class sqlconnection { String sDbDriver = "sun.jdbc.odbc.JdbcOdbcDriver"; String sConnStr = "jdbc:odbc:sqlconnect"; // sqlconnect 数据源名称: private Connecti

InnoDB 中文参考手册 --- 3 建立一个 InnoDB 数据库

参考|参考手册|数据|数据库|中文 InnoDB 中文参考手册 --- 犬犬(心帆)翻译 3 建立一个 InnoDB 数据库假设你已经安装了 MySQL 并且已经修改了 my.cnf 包含了必要的 InnoDB 参数设置 .在启动 MySQL 之前必须检查为InnoDB 指定的数据与日志文件路径是否存在以及在 这些目录上有足够的权限.InnoDB 不会自己建立目录,只能建立文件.同时检查是否有足够的磁盘空间存放数据与日志文件. 当创建一个 InnoDB 数据库时最好以命令行方式来运行 MySQL

C#反编译微软MSDN2003的帮助文档,并将反编译结果保存到一个SQLSERVER数据库中

server|sqlserver|编译|数据|数据库|微软 using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms; namespace MSDNOUT{ /// <summary> /// 反编译微软MSDN2003文档并保存到数据库的程序主窗体 /// </summary> public class dlgM

database-编程语言c、c++、c#、JAVA的应用前景及一个小型数据库开发需要哪些知识?

问题描述 编程语言c.c++.c#.JAVA的应用前景及一个小型数据库开发需要哪些知识? 在现阶段的网络应用开发.网页开发.电脑软件开发和手机的app开发中哪种编程语言应用的最为广泛? 目前在学习过程中已学习过c.JAVA和c#,但都是入门级的水平,之前在学习c时都在编写一些很无聊及无实际意义的程序,之后做JAVA的课程设计时,大部分的代码都是老师给的,只是让我们写其中的一些方法和类,现在正在学习c#,感觉上c#要比之前两种语言的开发过程更简单,现在主要集中在一些类似于记事本的窗口程序的开发设计

sqlite-Android SQLite数据库存储,怎样创建一个的数据库?

问题描述 Android SQLite数据库存储,怎样创建一个的数据库? 今天看<第一行代码--Android>,有一个地方没看懂,创建一个名为bookstore.db的数据库, 这个数据库在哪里创建,也就是创建数据库的代码在哪里写? 解决方案 SQLiteOpenHelper类的构造方法中传入db名称自然就会创建数据库了,然后在SQLiteOpenHelper.onCreate()方法里创建表. // A string that defines the SQL statement for c

卡住-【初学安卓】微型数据库卡死

问题描述 [初学安卓]微型数据库卡死 在模拟器里还能运行,但是多次滚动后就会卡住.放在手机上就闪退.望高手给出指引. 这是MainActivity里的代码 package com.itheima.db; import java.util.List; import org.w3c.dom.Text; import com.itheima.db.dao.PersonDao; import com.itheima.db.domain.Person; import android.app.Activit

一个有数据库支持的web项目,打包成war包时应该怎么配置数据库才能在别人电脑上也能运行?

问题描述 一个有数据库支持的web项目,打包成war包时应该怎么配置数据库才能在别人电脑上也能运行? 学生党,最近要交一项作业,编写一个数据库支持的web项目,然后打包成war包交上去,我想问对于数据库该怎么处理才能在其他电脑上运行时访问的也是我的数据库?用的是mysql 解决方案 你可以学习一下jdbc

zip-如何做一个不用数据库的后台?

问题描述 如何做一个不用数据库的后台? 我想做一个网页,要求要后台但没有数据库,求高手指点如何下手做?里面要运用到那些技术? 解决方案 ipo他的人就会高控盘 回复同意和他人的一