Learn C the Hard Way 的 ex17 数据库设计问题

Learn C the Hard Way's ex17 database design issues

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

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 又名(自己制作)部分中,有一个任务如下所示: 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? 所以这只是要求我重做管理这个的“三结构方式”数据库?

是的,您只能有 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 中(它很简洁)。将其与 "global variables" 模型进行比较……真是 一团糟 .

连接也是如此。

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

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