如何做一个国产数据库系统
Posted qianbo_insist
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何做一个国产数据库系统相关的知识,希望对你有一定的参考价值。
做一个国产数据库
做一个数据库系统真的是要懂的是基础,各种基础,网络,文件系统,操作系统,性能,测试,各方面都要懂
使用基本方法
索引文件+数据文件+ B+ 树 ,hash空间
如图是写的一个数据库文件,
前面两兆字节是索引,后面是数据。最前面的8字节数据为索引总量 4字节,和 目前索引量4字节。
1、定义我们的数据结构
typedef struct sdata
{
uint32_t index;
char vardata[128];
}sdata;
这个数据结构表明 index是索引 ,vardata是128字节的数据,长度不超过128字节,这个数据结构是各案例,以后我们会逐步修改
2 、写一个基本的数据库
//2M 的索引,一半的空间为索引号码,一半的空间为数据偏移地址
// 1024*1024/sizeof(int)
int bfile_write(const char * file,/*uint32_t index_num,*/ sdata data[],int n)
{
#define INDEX_BYTES 2 * 1024 * 1024
int index_num = 1024 * 1024 / sizeof(int); //max index number is 162144
if (n > index_num)
return -1;
FILE * fp = fopen(file, "wb");
if (fp == NULL)
return -1;
fpos_t pos_start = 0;
fpos_t pos_index = 8;
fpos_t pos_data = pos_index + INDEX_BYTES;
fpos_t position = 4 + 4 + INDEX_BYTES + sizeof(data[0].vardata) * n;
fsetpos(fp, &position);
fsetpos(fp, &pos_start);
//写入总索引量
fwrite(&index_num, sizeof(int), 1, fp);
//写入目前索引量
fwrite(&n, sizeof(int), 1, fp);
//排序写入文件
std::sort(&data[0], &data[n], Rule());
int offsetsum = 4+4+INDEX_BYTES;
int len = sizeof(data[0].vardata);
for (int i = 0; i < index_num; i++)
{
//wnum++;
if (i < n)
{
fwrite(&data[i].index, sizeof(int), 1, fp);
offsetsum += len;
fwrite(&offsetsum, sizeof(int), 1, fp);
}
else
{
uint64_t flag = 0;
fwrite(&flag, sizeof(uint64_t), 1, fp);
}
}
offsetsum = 4 + 4 + INDEX_BYTES;
fpos_t pos = offsetsum;
for (int i = 0; i < n; i++)
{
fsetpos(fp,&pos);
fwrite(&data[i].vardata, strlen(data[i].vardata), 1, fp);
pos += sizeof(data[0].vardata);
}
fclose(fp);
return 0;
}
以上这个函数调用将会产生一个2M多字节的数据库文件 test.db
2、读取搜索程序
//2M的空间做索引
int bfile_Search(const char * file)
{
size_t nr;
uint64_t indexf;//索引标识
uint64_t indexl;//索引长度,内容为x个索引
FILE * fp = fopen(file, "rb");
if (fp == NULL)
return -1;
nr = fread(&indexf, sizeof(uint64_t), 1, fp);
if (nr == 0)
{
fclose(fp);
return -1;
}
nr = fread(&indexl, sizeof(uint64_t), 1, fp);
if (nr == 0)
{
fclose(fp);
return -1;
}
//4字节索引号 4字节偏移地址
uint8_t * index_con = (uint8_t*)malloc(indexl * sizeof(uint32_t)*2);
nr = fread(index_con, indexl * sizeof(uint32_t) * 2, 1, fp);
if (nr == 0)
{
fclose(fp);
return -1;
}
for (int i = 0; i < indexl; i++)
{
//如果是零 前后跳过
}
return 0;
}
int main()
{
sdata data[100];
srand(1000);
for (int i = 0; i < 100; i++)
{
//模拟收集到的数据
data[i].index = rand() %50;
}
std::sort(&data[0], &data[100], Rule());
for (int i = 0; i < 100; i++)
{
cout<<"-->"<< data[i].index << endl;
sprintf(data[i].vardata, "the data is %ld", data[i].index);
}
bfile_write("./test.db", data, 100);
for (int i = 10; i < 21; i++)
{
int index = binSearch(i, data, 100);
if (index != -1)
{
cout << "we find it ,is " << index << endl;
}
}
return 0;
}
以上为调用,我们写了一个基本的样子程序,还没有完成,后面我们逐步改善这个程序,直到变成一个真正的数据库程序。我们会使用内存映射文件,b+树数据结构,hash 内存映射来修正我们的程序。
以上是关于如何做一个国产数据库系统的主要内容,如果未能解决你的问题,请参考以下文章