在主内存中存储关系的最佳方法是什么?

时间:2011-03-31 21:05:40

标签: c++ database-design data-structures database

我正在开发一个用于评估SPJ查询的迷你DBMS设计的应用程序。该程序正在用C ++实现。

当我必须处理联接和分组的查询时,我需要在主内存中维护一组记录。因此,我必须在主存储器中维护临时表,以执行用户输入的查询。

我的问题是,在C ++中实现这一目标的最佳方法是什么?我需要使用哪种数据结构才能实现这一目标?

在我的应用程序中,我将数据存储在二进制文件中并使用目录(包含所有现有表的模式),我需要检索数据并处理它们。

我的应用程序中只有2种数据类型:int(4 Bytes)和char(1 Byte)

我可以使用std :: vector。事实上,我尝试使用向量向量:内部向量用于存储属性,但问题是数据库中可能存在许多关系,并且每个关系可以是任意数量的属性。此外,这些属性中的每一个都可以是int或char。所以,我无法确定实现这一目标的最佳方法。

修改

我不能对表使用结构,因为我不知道新添加的表中有多少列,因为所有表都是在运行时根据用户查询创建的。因此,表模式不能存储在结构中。

2 个答案:

答案 0 :(得分:2)

一个关系是一组元组(在SQL中,一个表是一包行)。在关系理论和SQL中,关系(/ table)中的所有元组(/行)都符合标题。

因此有趣的是使一个对象存储关系(/ tables)由两个组件组成:一个类型为“Heading”的对象和一个包含实际元组的Set(/ Bag)对象(/rows).

“标题”对象本身是属性(/列)名称到“声明的数据类型”的映射。我不知道C,但在Java中它可能类似于Map< AttributeName,TypeName>或Map< AttributeName,Type>甚至Map< String,String> (前提是你可以使用这些字符串从它们所在的任何地方获取实际的'Type'对象。)

元组集(/ rows)由成员组成,这些成员都是属性值的映射到属性值的值,在您的情况下是int或String。这里最大的问题是,这表明你需要像Map< AttributeName,Object>这样的东西,但你可能会因为你的int不是一个对象而遇到麻烦。

答案 1 :(得分:0)

作为任何表行的通用容器,我很可能使用std::vector(正如Iarsmans所指出的那样)。至于表列,我很可能定义那些带有表示表模式的结构的列。例如:

struct DataRow
{
    int col1;
    char col2;
};

typedef std::vector<DataRow> DataTable;
DataTable t;
DataRow dr;
dr.col1 = 1;
dr.col2 = 'a';

t.push_back(dr);