【问题标题】:How To Create Database Tables in C如何在 C 中创建数据库表
【发布时间】:2021-06-29 22:37:19
【问题描述】:

为了我的计算机科学学位,我需要使用 C 编写一个小型/简单的数据库应用程序(因此不能选择使用 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;

    ....

};

有没有更好的方法来做到这一点?

【问题讨论】:

  • 更好的方法是使用SQLite
  • 我更新了我的问题。这是为了大学,以学习为目的。所以是的,我几乎必须发明自己的数据库。

标签: database


【解决方案1】:

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

  1. 制作一个“模式编译器”来获取表定义,写入structs 并编译数据库引擎。
  2. 从架构定义计算每列的字节偏移和长度。将记录保存和恢复为字节数组,并使用该偏移/长度列表选择字段。

最常见的是 #2,但 #1 的优点是 C 编译器“知道”表结构,并且会对您的列进行类型检查。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 2011-02-14
      • 2021-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多