简易数据库设计文档
一、基本信息
项目名称:简易数据库
使用数据结构: 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时分别进行了各操作,统计时间



508

被折叠的 条评论
为什么被折叠?



