日期:2014-05-16  浏览次数:20513 次

简易内存数据库(一)总述

项目的要求是:

需要接受create,insert,select, update,delete等语句,在内存中建立一个数据库表。并对这个表进行相应的操作。

?

动手之前有一些提示。

?

  • 不管我们处理哪一种语句,要做的都是2件事:1)解析相关的语句。2)把语句所表述的内容保存在内存中。

我先解释一下这两点:

?

首先,你的程序是运行在内存中,程序所要处理的内容当然需要预先保存在内存中,这样你才可以进行内容操作。

保存在内存中,换句话说你可以申明变量,把文件中所表述的内容赋值到变量中。

?

那么这个或这些变量应该是什么类型的呢。

你第一个想到的,既然是文本形式读到的内容,就保存在一大块char[]中了。这当然是可以的。

只是整块的保存不利于我们今后对相应数据的处理。比如每次取某一条数据,我们都会需要对整个文本进行解析。这样做效率太低。

?

因此我们要做的是,先把整块文本解析好,然后把它保存在比较利于今后处理的类型中。

这就是我说的要做的2件事

?

  • 把问题分解了来解决。

遇到一些问题很难马上想明白,正常人都是这样的。这种时候把问题分解开来就方便解决了。

比如实现SELECT的时候,我们会觉得非常复杂,无从下手。SELECT要选择某些字段,要符合某个或某些条件,还要符合一定的顺序。SELECT函数我是这样写的

TableRow * selectTable(SelectInfo *info)
{
	TableRow * rows = NULL;
	//如果有排序要求先排序
	if (strlen(info->order->columnName)>0)
		 rows = Order(info->order);
	//拍完序再过滤
	Filter(&rows, info);

	return rows;
}

?

排序具体怎么排,则交给Order函数了。过滤具体怎么过滤,就交给Filter函数了。其实Order函数和Filter函数中也有很多小的函数组成的。

我们写一组功能实现时,一旦觉得过于复杂没有办法实现,可以用一个子函数来代表某个子功能已经实现了。这样就可以专注到所有功能完成。而子功能的实现可以在实现子函数的时候再来考虑。

?

再比如说。我要设计一个放表头的结构,一个表头有表名和很多列。列有列名,有列的长度,列是否允许为空等等。

想来很复杂,但是这个结构我会这样设计

struct Table
{
	char  name[50];
	Column * columns;
};

?这样设计并没有解决所有的问题。但是这样的设计就是为了把问题分解开来。

?

?

这些个内容需要同学一边开发一边自己体会。