【问题标题】:What is the best way to store a relation in main memory?在主存中存储关系的最佳方式是什么?
【发布时间】:2011-03-31 21:05:40
【问题描述】:

我正在开发一个应用程序,它是一个用于评估 SPJ 查询的小型 DBMS 设计。该程序是用 C++ 实现的。

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

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

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

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

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

编辑

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

【问题讨论】:

  • 你试过std::vector吗?
  • @larsmans,请协助。谢谢
  • 我正在尝试找出您已经尝试过的内容。

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


【解决方案1】:

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

所以让一个存储关系的对象(/tables)由两个组件组成是很有趣的:一个“Heading”类型的对象和一个包含实际元组(/rows)的 Set(/Bag)对象。

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

元组集 (/rows) 由所有成员组成,这些成员都是属性 (/column) 名称到属性值的映射,在您的情况下,属性值可以是 int 或 String。这里最大的问题是,这表明您需要 Map 之类的东西,但您可能会因为 int 不是对象而遇到麻烦。

【讨论】:

    【解决方案2】:

    作为任何表格行的通用容器,我很可能使用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);
    

    【讨论】:

    • brecht,上述解决方案的问题是我要在运行时添加几个表,而这些表的架构是未知的。在这种情况下,我无法维护结构,因为我不知道要添加多少表,以及每个表有多少列
    猜你喜欢
    • 1970-01-01
    • 2012-10-03
    • 1970-01-01
    • 2011-01-02
    • 2013-06-14
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    相关资源
    最近更新 更多