基于C++实现的简易数据库

简易数据库设计文档

一、基本信息

项目名称:简易数据库

使用数据结构: B+ 树

开发环境: Visual Studio 2015 Community

测试环境:

  • Windows 10 家庭版 14393.1198
  • 处理器: Intel Core i5-6300HQ CPU @ 2.30GHz
  • 内存: 8GB
  • 系统类型: 64位操作系统

功能概述:实现了<key, value>型数据的查找、插入、删除、修改等功能。

二、提供接口

本数据库所有数据均采用c++ 标准库中的string类型存储。

创建数据库

Database();

检查目录的正确性

bool checkFile(); 如果data目录不存在,则会报出错误信息,返回false。

新建数据库:bool refresh();

新建一个空的数据库,会覆盖原有的所有数据。

插入数据

string insert(const string &key, const string&value);

key为索引,value为值。

如果插入成功,返回“Success.”,否则返回错误信息。

查找数据

string search(const string &key);

key为所要查找的数据的索引。

如果找到,返回“Found:”+找到的value;如果没有,返回

“Not Found.”。

删除数据:string del(string &key);

key为所要删除的数据的索引。

如果删除成功,返回“Success.”,否则返回错误信息。

修改数据

string modify(const string &key, const string&value);

key为所要修改的数据的索引,value为修改后的值。

如果修改成功,返回“Success.”,否则返回错误信息。

保存:void save();

将内存中的数据与文件中同步。当程序正常关闭时,会自动进行保存。

三、功能实现

3.1 模块实现:

本简易数据库由以下部分的代码构成:

·BPlustree.h & BPlustree.cpp:

​ 包含了B+树及其内部 节点的声明以及实现。

·functions.h & functions.cpp:

​ 包含了一些需要用到的字符串处理等根据需要自己编写的函数。

测试部分代码

·AutoTest.cpp:

​ 自动进行数据量为100万的插入删除测试,并且输出所需要的时间。

·ManualTesting.cpp:

​ 提供用户自定义的使用,有相关的使用提示和错误处理。

3.2 功能实现:

本简易数据库使用的数据结构是B+树。

由于考虑到数据库需要存储的文件规模很大,而指针在文件中的存储并不方便,因此本简易数据库并没有直接采用指针,而是在每个Node中记录了其父节点和子节点在文件中的位置,来代替指针的作用。节点的数据在文件中和内存中都有保存。其中文件中分为三行,第一行为该节点所储存的所有key,第二行为该节点的所有子节点在文件中的位置,第三行为该节点的父节点在文件中的位置。每个节点在文件中的位置记为 index,取代指针,起到了访问这个节点的作用,在内存中也是如此。

在查找、插入、修改、删除等操作中,如果需要访问一个节点的信息,程序会先在内存中根据index查找是否之前从文件中读取过该节点,如果有,那么直接调用内存中的数据;如果没有,那么将文件指针移到index的位置,读取数据后,将数据存到内存中。这样可以避免反复从文件中读取数据,也避免了每次修改了节点的数据后,还要修改文件,大大节省了时间。由于总数据量很大,因此只在内存中存储一部分节点。如果在不断读取节点的过程中,内存中的节点的数量超过设定的值(在#define中),那么程序将会自动进行保存,即将内存中的数据写入文件中,并清空内存中的数据。程序在用户执行查找操作或正常退出程序时也会自动进行保存,用户也可以用手动进行保存(利用save()接口)。

当进行插入、删除、修改等会修改各节点的数据的操作时,为了节省时间,所有的数据只会在内存中进行修改,而后一次性通过自动或是手动的保存操作,一次性同步到文件中。

四、特点及其分析

如前文所述,本简易数据库并没有直接采用指针类型,而是使用节点在文件中的位置,即index,作为访问节点的工具。这样避免了所有数据堆叠在内存中的情况。并且这种方式的存储,使得每个节点直接被储存在了文件中,对应关系明确。读取数据时可以直接读取各个节点的信息,而不是在运行程序后要在内存中重新构建一棵B+树。

五、测试及其分析

  • 在M=16,32,64时分别进行了各操作,统计时间
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值