3

我真的坚持这个。ex17 应该通过提供一个简单的数据库来教我堆和堆栈内存分配(我的问题是具体的,但我会把它留在那里以防万一您需要完整的代码)。关于数据库某些设计决策的目的是什么没有太多解释,这就是我寻求帮助的原因。

1)必要性或只是设计方便(约定)?

struct Address {
    int id;
    int set;
    char name[MAX_DATA];
    char email[MAX_DATA];
};

struct Database {
    struct Address rows[MAX_ROWS];
};

struct Connection {
    FILE *file;
    struct Database *db;
};

我不确定为什么会有三个结构。在代码中还有类似的表达式(希望您理解变量的名称)conn->db->rows[i]。我的问题是这三个是必要的吗?我的意思是,为什么我们需要一个连接结构?为什么不直接创建一个独立FILE *file的东西并完全避免使用struct Database *db指针呢?

2)可能这会对我第一个有帮助。在Extra credit练习的 aka(自己制作)部分,有一个任务如下:Try reworking the program to use a single global for the database connection. How does this now version of the program compare to the other one?那么这只是要求我重新设计管理此数据库的“3 结构方式”吗?

4

1 回答 1

2

是的,您只能拥有struct Adress一个FILE *指向数据库文件的全局变量和一个struct Adress rows[MAX_ROWS]用于存储数据的全局变量。但是,一个真实的数据库有一个名称、关联的文件、权限等(您给出的示例非常简单)。

但是您可以修改结构以改进模型并帮助您理解。考虑一下,例如:

struct Database {
    char name[DB_NAME];
    enum charset_list charset;
    struct Address rows[MAX_ROWS];
}

它现在为您提供有关您的数据库的更多信息(它的名称和字符集 [ utf8latin1等]),并且它们都包含在相同的内容中struct(它很简洁)。将其与“全局变量”模型进行比较……真是一团糟

连接也是如此。

struct Connection {
    FILE *fp;
    char request_db[DB_NAME];
    char host[HOSTNAME];
    char ip[IPV4_LEN];
    struct User *user;
    struct database *conn;
}

在这里,您有一个版本,可以让您拥有多个数据库文件的索引文件。当用户请求连接时,函数将查找索引表,检索数据库名称和相应的文件,设置FILE *指针并进行必要的函数调用以将工作返回conn给用户。

于 2020-03-31T18:46:45.300 回答