मैं वास्तव में इस पर अटक गया हूँ। 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;
};

मुझे यकीन नहीं है कि तीन structs क्यों हैं। आगे कोड में ऐसे भाव हैं (आशा है कि आप चर के नाम समझते हैं) 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? तो क्या यह मुझे इसे प्रबंधित करने के "3-संरचना-मार्ग" को फिर से काम करने के लिए कह रहा है डेटाबेस?

3
NEOdinok 31 मार्च 2020, 21:13

1 उत्तर

सबसे बढ़िया उत्तर

हां, आपके पास केवल 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 में निहित है (यह संक्षिप्त है)। इसकी तुलना "वैश्विक चर" मॉडल से करें... क्या एक गड़बड़ी है।

वही कनेक्शन के लिए जाता है।

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

यहां, आपके पास एक संस्करण है जो आपको कई डेटाबेस फ़ाइलों की अनुक्रमणिका फ़ाइल रखने में सक्षम बनाता है। जब कोई उपयोगकर्ता कनेक्शन का अनुरोध करता है, तो एक फ़ंक्शन इंडेक्स टेबल को देखेगा, डेटाबेस का नाम और संबंधित फ़ाइल पुनर्प्राप्त करेगा, FILE * पॉइंटर सेट करेगा और उपयोगकर्ता को एक कार्यशील conn वापस करने के लिए आवश्यक फ़ंक्शन कॉल करेगा।

2
Enzo Ferber 31 मार्च 2020, 18:46