我需要使用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;
....
};
有更好的方法吗?
答案 0 :(得分:0)
我只能想到两种截然不同的方法:
struct
并编译数据库引擎。最常见的是#2,但#1的优点是C编译器'知道'表结构,并将对列进行类型检查。
答案 1 :(得分:-1)
我知道这是一个老问题,我的回答有点无关紧要,但是当我为了好玩而编写自定义数据库时遇到了同样的问题。但是,我的解决方案是用 C++ 编写本机动态结构库,并大量利用 OOP 特性,例如虚函数。也许,您可以找到一种方法将其传输到 C 库中,或者获得一些灵感来开发自己的库。
为了您的参考,我将我的代码上传到 GitHub,这里是链接 c++-dynamic-type-library。我在 README 文件中说明了一些用法,其中之一就是从输入创建一个具有可变数量的属性和类型的结构(因此可以适应 CREATE TABLE 命令)。我还编写了 Serialize
和 Deserialize
函数来将结构体转换为字符串并来回转换。