如何在C中创建数据库表

时间:2011-10-08 21:36:31

标签: database

我需要使用C编写一个小/简单的数据库应用程序,用于我的CS学位(因此使用SQLite或任何其他可用的应用程序不是一个选项。换句话说,我需要在这里重新发明轮子)。

我的想法是使用B-Tree来存储每个表的项目。我面临的问题是表需要灵活地保存未知数量的列,并且每列可以是STRING或INT。例如,使用以下命令:

CREATE TABLE student (STRING name, INT age)

我需要创建一个包含字符串和整数的表。改为使用此命令:

CREATE TABLE grade (INT grade1, INT grade2, INT grade3)

我需要创建一个包含三个整数的表。

如何实现这种灵活性?

到目前为止,我唯一的想法是在其中创建一个包含多个联合的结构,其中每个联合可以是STRING或INT。我还需要在内部放置很多联合,以确保容纳表所请求的所有列。例如:

struct table{
    union{
        int number;
        char *text;
    }column1;

    union{
        int number;
        char *text;
    }column2;

    union{
        int number;
        char *text;
    }column3;

    ....

};

有更好的方法吗?

2 个答案:

答案 0 :(得分:0)

我只能想到两种截然不同的方法:

  1. 创建一个获取表定义的“模式编译器”,写入struct并编译数据库引擎。
  2. 架构定义中的
  3. 计算每列的字节偏移量和长度。将记录保存并恢复为字节数组,并使用该偏移/长度列表选择字段。
  4. 最常见的是#2,但#1的优点是C编译器'知道'表结构,并将对列进行类型检查。

答案 1 :(得分:-1)

我知道这是一个老问题,我的回答有点无关紧要,但是当我为了好玩而编写自定义数据库时遇到了同样的问题。但是,我的解决方案是用 C++ 编写本机动态结构库,并大量利用 OOP 特性,例如虚函数。也许,您可以找到一种方法将其传输到 C 库中,或者获得一些灵感来开发自己的库。

为了您的参考,我将我的代码上传到 GitHub,这里是链接 c++-dynamic-type-library。我在 README 文件中说明了一些用法,其中之一就是从输入创建一个具有可变数量的属性和类型的结构(因此可以适应 CREATE TABLE 命令)。我还编写了 SerializeDeserialize 函数来将结构体转换为字符串并来回转换。