简易数据库管理系统(DBMS)设计与实现

一、概要

1.1 数据库管理系统/数据库

下图展示了DBMS(数据库管理系统)的地位,数据库(系统)其实包含了DBMS和数据两部分。
在这里插入图片描述

1.2 架构设计

在这里插入图片描述

1.3 设计思路

  1. 数据仓库:使用XML(可拓展标记语言)文件作为微型数据仓库,对XML文件的读写操作相当于对数据的读写操作;
  2. SQL解析: 使用正则表达式解析SQL语句;
  3. 索引:设计索引结构,使用B+树算法;

实现1、2两步,基本上就能完成一个简陋的数据库管理系统了,因为可以使用SQL语句对存储在XML文件的数据进行增删改查(CRUD)操作。

1.4 规划

编程语言:Java

  1. v1.0版本:支持简单、单句SQL解析、以XML文件作为微型数据仓库,在控制台启动和操作
  2. v2.0版本:增加索引

二、细节

2.1 XML文件作为数据仓库

在这里插入图片描述
1)逻辑上的一张表在物理上是一个文件夹,里面包含多个XML文件
2)一个XML文件作为一张物理子表(如上图所示),多个物理子表构成一张逻辑表
3)每张表都有一个配置文件,用来存储数据类型、物理子表数量、是否建有索引等信息
4)所有对数据表的操作都是基于DOM4j解析对XML的读写操作

2.2 正则表达式解析SQL语句

1)SQL语句预处理(去重多余空格、统一转化为小写等)
2)正则匹配关键字(如select xx from xx 等)
3)根据SQL语句关键字和关键字后的内容,调用相应的方法

2.3 B+树索引结构

1)B+树的key存的要索引的字段,value存索引字段对应的逻辑子表名称
2)在查询时,根据key对应的value(即逻辑子表名称)直接打开对应的XML文件,然后遍历其中的数据找到符合条件的记录(由于每张物理子表/XML文件设计的容量较小,因此遍历的时间较短,但缺点是物理子表/XML文件过多)
3) 每张表索引建立后,会把索引持久化到磁盘上(XML文件里),每次启动系统都会加载索引文件到内存中的数据结构中

三、总结

实现的是非常简单的一种DBMS,在控制台启动,可以实现一些基础的SQL语句增删改查,对字段建立索引后可大幅提高查询效率。
缺点及改进如下

  1. 由于SQL解析使用的正则表达式,因此对于复杂的SQL语句(多句复合、嵌套等)处理起来非常麻烦,因此没有继续拓展。改进思路是SQL解析部分使用词法和语法分析器,可以实现更多、更复杂的SQL语句解析;
  2. 由于数据仓库使用的是XML文件,而索引设计在XML文件名上,因此在数据安全、存取效率上都很低。改进思路是自定义文件格式并编写处理代码,数据使用二进制格式(并加密)存储,而索引部分可将B+树持久化到磁盘上(MySQL InnoDB B+树的叶子节点存的就是磁盘上的数据);
  3. 可以考虑做成前后端分离的系统,这样可以将系统部署在服务器上,然后通过浏览器端访问进行增删改查;
  4. 考虑到并发安全,可以对整张表进行加锁(代价最低,实现最简单,用一个字段/变量指示是否加锁即可),如果学习了MySQL之后的话,可以只到对一行记录进行加锁或使用MVCC进行无锁控制。

源码

只是简单的实现,还没有往改进的方向上去做。
github
gitee

  • 10
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值