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];
}
它现在为您提供有关您的数据库的更多信息(它的名称和字符集 [utf8
、latin1
等]),它们都包含在同一个 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=] 给用户。
我真的被这个问题困住了。 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];
}
它现在为您提供有关您的数据库的更多信息(它的名称和字符集 [utf8
、latin1
等]),它们都包含在同一个 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=] 给用户。