您的位置:首页 > 其它

一种简单的数据存储设计

2013-04-23 14:15 260 查看
一.设计目的

在xx项目中,需要载入多张表并对表做关联,然后后面查询使用。但是由于每次系统启动时候都要加载多张表本分析表的关系,所以在每次系统启动的时候,都要卡一下,并且有时候表很大,而分配给系统的内存又有限。为了解决上诉等问题,设计了一种方法,就是索引加数据库方法,下面是索引的基本设计(数据库不是我做的,数据库主要使用了文件映射技术来解决内存压力)。

注:本文数据库指数据的集合,只包含数据。

二.构成

(1)FileHandler类。该类对索引文件做控制。类由自己创建,在第一次初始化数据库之后,执行一次写索引,将索引内容写出到文件。以后每次启动都通过读索引来加载。

(2)Info类。这是一个简化,实际Info类做了多层嵌套(数据的索引层次太多了)。Info类保存了本级的id值和内部数据(可能是个map,或者vector之类)。

(3)IndexBuilder类。这个类负责在初始化的时候,反复从数据库取得索引信息,并将索引信息记录进map。

(4)Index类。这个类读取所以呢的文件,并提供查询方法。

三.实现

typedef vector<size_t> Container;

class FileHandler{
private:
FileHandler();
public:
auto_ptr<FileHandler> createFileHandler();
void writeOneKey(const char*);
void writeOneVal(const char*);
void writeValList(const Container&);
char readOneKey();
char readOneVal();
void readValList(size_t, Container&);
private:
FILE* key;
FILE* val;
};

class Info{
public:
Info(size_t);
private:
NONE_COPY_AND_ASSIGN(Info);
public:
void addIndexInfo(const IndexInfo&);
void getIndexInfo(IndexInfo&);
void saveToFile();
void loadFromFile();
size_t getId();
private:
size_t id;
Container contain;
};

class IndexBuilder{
public:
IndexBuilder(const PARAM&);
private:
NONE_COPY_AND_ASSIGN(IndexBuilder);
public:
void addIndex(const Index&);
void saveToFile();
private:
map<size_t, Info> infos;
FileHandler* files;
};

class Index{
public:
Index(const string&);
private:
NONE_COPY_AND_ASSIGN(Index);
public:
void getIndex(size_t, Index&);
void loadFromFile();
private:
map<size_t, Info> infos;
FileHandler* files;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: