Узнайте C о проблемах проектирования базы данных Hard Way ex17 - PullRequest
3 голосов
/ 31 марта 2020

Я действительно застрял на этом. Предполагается, что ex17 обучает меня распределению памяти в куче и стеке, предоставляя простую базу данных (мои вопросы уточняются c, но я оставлю это на всякий случай, если вам нужен полный код). Существует не так много объяснений о том, какова цель определенных проектных решений базы данных, и поэтому я обращаюсь за помощью.

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? Так это просто просит меня переделать «трехструктурный способ» управления этой базой данных?

1 Ответ

2 голосов
/ 31 марта 2020

Да, у вас может быть только struct Adress, глобальный FILE *, указывающий на файл базы данных, и глобальный struct Adress rows[MAX_ROWS] для хранения данных. Однако у реальной базы данных есть имя, связанные файлы, разрешения и т. Д. c (приведенный вами пример очень прост).

Но вы можете изменить структуры, чтобы развить модель и помочь вам понять. Рассмотрим это, например:

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

Теперь он предоставляет вам больше информации о вашей базе данных (это имя и набор символов [utf8, latin1 и т. Д.]), И все это содержится в одном и том же struct (это сжато). Сравните это с моделью «глобальных переменных» ... что за беспорядок .

То же самое касается соединения.

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

Здесь у вас есть версия который позволяет вам иметь файл index из нескольких файлов базы данных. Когда пользователь запрашивает соединение, функция просматривает индексную таблицу, получает имя базы данных и соответствующий файл, устанавливает указатель FILE * и выполняет необходимые вызовы функций, чтобы вернуть пользователю рабочий conn.

...