ज्ञान में निवेश करने पर सर्वोत्तम ब्याज मिलता है।
बेंजामिन फ्रैंकलिन
आधुनिक दुनिया में शिक्षा सर्वव्यापी है। अब पहले से कहीं अधिक, यह हमारे समाज में एक महत्वपूर्ण भूमिका निभाता है। वास्तव में, यह इतना महत्वपूर्ण है कि हम में से कई लोग स्कूल या कॉलेज की पढ़ाई खत्म करने के बाद भी अपनी शिक्षा अच्छी तरह से जारी रखते हैं।
हम सभी ने आजीवन सीखने, अनौपचारिक शिक्षा और सभी उम्र के लिए कार्यशालाओं के बारे में सुना है। ये तरीके औपचारिक शिक्षा से कई मायनों में अलग हैं, लेकिन इनमें कुछ समानताएं भी हैं। कक्षाएं, पाठ, शिक्षक और छात्र हैं। और जैसा कि एक पारंपरिक सेटिंग में होता है, हम कक्षा अनुसूची, उपस्थिति डेटा और प्रशिक्षक या छात्र उपलब्धि पर नज़र रखना चाहेंगे। इन जरूरतों को पूरा करने के लिए हम एक डेटाबेस कैसे डिजाइन कर सकते हैं? यही हम इस लेख में शामिल करेंगे।
पेश है हमारा शिक्षा डेटाबेस मॉडल
इस आलेख में प्रस्तुत मॉडल हमें निम्न के बारे में डेटा संग्रहीत करने में सक्षम बनाता है:
- कक्षाएं/व्याख्यान
- प्रशिक्षक/व्याख्याता
- छात्र
- व्याख्यान उपस्थिति
- छात्रों/व्याख्याताओं की उपलब्धि
हम इस मॉडल का उपयोग स्कूल की समय सारिणी के रूप में, अन्य समूह गतिविधियों (तैराकी पाठ, नृत्य कार्यशाला) के लिए या यहां तक कि ट्यूशन जैसी आमने-सामने की गतिविधियों के लिए भी कर सकते हैं। सुधार के लिए अभी भी बहुत जगह है, जैसे कक्षा स्थान डेटा या कार्यशाला की अवधि संग्रहीत करना; हम इन्हें आगामी लेखों में शामिल करेंगे।
आइए अपने बुनियादी शिक्षा डेटाबेस तत्वों के साथ शुरुआत करें:टेबल।
द बिग थ्री:स्टूडेंट, इंस्ट्रक्टर और क्लास टेबल्स
student
, instructor
, और class
तालिकाएँ हमारे डेटाबेस का मूल भाग बनाती हैं।
student
ऊपर दिखाई गई तालिका का उपयोग छात्रों के बारे में बुनियादी डेटा को संग्रहीत करने के लिए किया जाता है, लेकिन इसे विशिष्ट आवश्यकताओं के अनुसार विस्तारित किया जा सकता है। तीन संपर्क विशेषताओं के अपवाद के साथ, तालिका में सभी विशेषताएँ आवश्यक हैं:
first_name
- छात्र का नामlast_name
- छात्र का उपनामbirth_date
- छात्र की जन्मतिथिcontact_phone
- छात्र का फोन नंबरcontact_mobile
- छात्र का मोबाइल फोन नंबरcontact_mail
- छात्र का ईमेल पताcategory_id
-category
सूची इस संरचना के साथ, हम प्रति छात्र केवल एक श्रेणी तक सीमित हैं। यह ज्यादातर मामलों में काम करता है, लेकिन कुछ स्थितियों में हमें कई श्रेणियों को सूचीबद्ध करने के लिए जगह की आवश्यकता हो सकती है। जैसा कि आप देख सकते हैं, कई-से-अनेक संबंध जोड़ना जोstudent
category
शब्दकोश इस समस्या को हल करता है। हालांकि, इस परिदृश्य में, हमें अपने डेटा को संभालने के लिए और अधिक जटिल क्वेरी लिखने की आवश्यकता होगी।
चूंकि हमने इसका उल्लेख किया है, आइए आगे बढ़ते हैं और category
यहाँ तालिका।
यह तालिका एक शब्दकोष है जिसका उपयोग कुछ मानदंडों के आधार पर छात्रों को समूहबद्ध करने के लिए किया जाता है। name
विशेषता तालिका में एकमात्र डेटा है (id
. के अलावा , प्राथमिक कुंजी) और यह अनिवार्य है। मूल्यों का एक सेट जो यहां संग्रहीत किया जा सकता है वह है छात्र की रोजगार की स्थिति:"छात्र", "रोजगार", "बेरोजगार" और "सेवानिवृत्त"। हम कुछ अत्यधिक विशिष्ट मानदंडों के आधार पर अन्य सेटों का भी उपयोग कर सकते हैं, जैसे "योग पसंद है", "हाइकिंग पसंद है", "बाइक की सवारी पसंद है" और "कुछ भी पसंद नहीं है"।
instructor
तालिका में संगठन के सभी प्रशिक्षकों / व्याख्याताओं की सूची है। तालिका में विशेषताएँ हैं:
first_name
- प्रशिक्षक का नामlast_name
- प्रशिक्षक का उपनामtitle
- प्रशिक्षक का शीर्षक (यदि कोई हो)birth_date
- प्रशिक्षक की जन्मतिथिcontact_phone
- प्रशिक्षक का फोन नंबरcontact_mobile
- प्रशिक्षक का मोबाइल फोन नंबरcontact_mail
- प्रशिक्षक का ईमेल पता
title
और तीनों contact
गुण अनिवार्य नहीं हैं।
student
टेबल और instructor
तालिका एक समान संरचना साझा करती है, लेकिन इस जानकारी को व्यवस्थित करने की एक और संभावना है। दूसरा तरीका यह होगा कि एक person
तालिका (जो सभी कर्मचारी और छात्र डेटा संग्रहीत करती है) और इसमें कई-से-अनेक संबंध हैं जो हमें उस व्यक्ति को सौंपी गई सभी भूमिकाओं के बारे में बताते हैं। दूसरे दृष्टिकोण का सबसे महत्वपूर्ण लाभ यह है कि हम केवल एक बार डेटा संग्रहीत करेंगे। यदि कोई एक कक्षा में प्रशिक्षक है और दूसरी कक्षा में छात्र है, तो वे डेटाबेस में केवल एक बार दिखाई देंगे, लेकिन दोनों भूमिकाओं के साथ परिभाषित किया गया है।
हमने अपने शैक्षिक डेटाबेस मॉडल के लिए टू-टेबल दृष्टिकोण का चयन क्यों किया? आम तौर पर, छात्र और प्रशिक्षक अलग-अलग व्यवहार करते हैं, वास्तविक जीवन और हमारे डेटाबेस दोनों में। उसके कारण, उनके डेटा को अलग से संग्रहीत करना बुद्धिमानी हो सकती है। हम दोनों तालिकाओं में दिखाई देने वाली किसी भी समान व्यक्ति की जानकारी को मर्ज करने के अन्य तरीके ढूंढ सकते हैं (उदाहरण के लिए बाहरी आईडी के आधार पर सम्मिलित/अपडेट क्वेरी की जोड़ी, जैसे सामाजिक सुरक्षा नंबर या वैट नंबर)।
class
तालिका एक कैटलॉग है जिसमें सभी वर्गों के बारे में विवरण होता है। हमारे पास प्रत्येक वर्ग प्रकार के कई उदाहरण हो सकते हैं। तालिका में विशेषताएं इस प्रकार हैं (end_date
. को छोड़कर सभी अनिवार्य हैं ):
class_type_id
-class_type
शब्दकोश।name
– कक्षा का संक्षिप्त नाम है।description
- यह विवरणclass_type
टेबल.start_date
- कक्षा शुरू होने की तारीख।end_date
- कक्षा की समाप्ति तिथि। यह अनिवार्य नहीं है क्योंकि हो सकता है कि हम हमेशा पहले से प्रत्येक कक्षा के लिए सटीक समाप्ति तिथि नहीं जानते हों।completed
- एक बूलियन मान है जो दर्शाता है कि क्या सभी नियोजित वर्ग गतिविधियाँ समाप्त हो गई हैं। यह तब आसान होता है जब हम नियोजितend_time
. पर पहुंच जाते हैं एक कक्षा के लिए लेकिन अन्य कक्षा गतिविधियों को अभी तक पूरा नहीं किया गया है।
class_type
तालिका एक सरल कैटलॉग है, जिसका उद्देश्य छात्रों को दिए जाने वाले व्याख्यान या कक्षाओं के बारे में बुनियादी जानकारी संग्रहीत करना है। इसमें "अंग्रेज़ी भाषा (समूह)", "पोलिश भाषा (समूह)", "क्रोएशियाई भाषा (समूह)", "अंग्रेज़ी भाषा (व्यक्तिगत रूप से)", या "नृत्य पाठ" जैसे मान हो सकते हैं। इसकी केवल दो अनिवार्य विशेषताएं हैं - name
और description
, जिनमें से दोनों को और अधिक स्पष्टीकरण की आवश्यकता नहीं है।
class_schedule
तालिका में व्याख्यान और कक्षाओं के लिए विशिष्ट समय होता है। तालिका में सभी विशेषताएँ अनिवार्य हैं। class_id
विशेषता class
तालिका, जबकि start_time
और end_time
उस विशिष्ट व्याख्यान के प्रारंभ और समाप्ति समय हैं।
यहाँ कौन है? उपस्थिति-संबंधित तालिकाएँ
attend
तालिका जानकारी संग्रहीत करती है कि किस छात्र ने किस कक्षा में भाग लिया और अंतिम परिणाम। तालिका में विशेषताएँ हैं:
student_id
-student
टेबलclass_id
-class
टेबलclass_enrollment_date
- वह तारीख है जब छात्र ने उस कक्षा में भाग लेना शुरू किया थाclass_drop_date
- वह तारीख जब छात्र ने कक्षा छोड़ दी। इस विशेषता का मूल्य तभी होगा जब छात्र ने कक्षा की समाप्ति तिथि से पहले कक्षा छोड़ दी हो। उस स्थिति में,drop_class_reason_id
विशेषता मान भी सेट होना चाहिए।drop_class_reason_id
-drop_class_reason
टेबलattendance_outcome_id
-attendance_outcome
टेबल
class_drop_date
. को छोड़कर सभी डेटा और drop_class_reason_id
आवश्यक है। ये दोनों तभी भरे जाएंगे जब और केवल तभी जब कोई छात्र कक्षा छोड़ता है।
drop_attendance_reason
तालिका एक शब्दकोश है जिसमें विभिन्न कारणों से एक छात्र एक पाठ्यक्रम छोड़ सकता है। इसकी केवल एक विशेषता है, reason_text
, और यह अनिवार्य है। मूल्यों के एक उदाहरण सेट में शामिल हो सकते हैं:"बीमारी", "खोई हुई रुचि", "पर्याप्त समय नहीं है" और "अन्य कारण"।
attendance_outcome
तालिका में दिए गए पाठ्यक्रम में छात्र गतिविधि के बारे में विवरण हैं। outcome_text
तालिका में एकमात्र विशेषता है और यह आवश्यक है। संभावित मानों का एक सेट है:"प्रगति में", "सफलतापूर्वक पूर्ण", "आंशिक रूप से पूर्ण" और "कक्षा पूरी नहीं की"।
प्रभारी कौन है? शिक्षण-संबंधित तालिकाएँ
teach
, drop_teach_reason
और teach_outcome
टेबल उसी तर्क का उपयोग करते हैं जैसे attend
, drop_attendance_reason
और attendance_outcome
टेबल। ये सभी तालिकाएँ प्रशिक्षकों की पाठ्यक्रम-संबंधी गतिविधियों के बारे में डेटा संग्रहीत करती हैं।
teach
तालिका का उपयोग यह जानकारी संग्रहीत करने के लिए किया जाता है कि कौन सा प्रशिक्षक किस कक्षा को पढ़ा रहा है। तालिका में विशेषताएँ हैं:
instructor_id
-instructor
टेबल.class_id
-class
टेबल.start_date
- वह तारीख है जब प्रशिक्षक ने उस कक्षा में काम करना शुरू किया था।end_date
- वह तारीख है जब शिक्षक ने उस कक्षा में काम करना बंद कर दिया था। यह अनिवार्य नहीं है क्योंकि हम पहले से नहीं जान सकते कि क्या प्रशिक्षक कक्षा की समाप्ति तिथि तक पढ़ाएगा।drop_teach_reason_id
-drop_teach_reason
टेबल। यह अनिवार्य नहीं है क्योंकि प्रशिक्षक कक्षा नहीं छोड़ सकता है।teach_outcome_id
-teach_outcome_reason
टेबल.
drop_teach_reason
तालिका एक साधारण शब्दकोश है। इसमें संभावित स्पष्टीकरणों का एक सेट शामिल है कि क्यों प्रशिक्षक ने अपनी अंतिम तिथि से पहले शिक्षण कक्षा समाप्त कर दी। केवल एक अनिवार्य विशेषता है:reason_text
. यह "बीमारी", "अन्य परियोजना/नौकरी में स्थानांतरित", "छोड़ दिया", या "अन्य कारण" हो सकता है।
teach_outcome
तालिका एक विशेष पाठ्यक्रम पर प्रशिक्षक की सफलता का वर्णन करती है। outcome_text
तालिका की एकमात्र विशेषता है और यह आवश्यक है। इस तालिका के लिए संभावित मान हो सकते हैं:"प्रगति में", "सफलतापूर्वक पूर्ण", "आंशिक रूप से पूर्ण" और "शिक्षण कक्षा पूरी नहीं की है"।
student_presence
तालिका का उपयोग किसी विशिष्ट व्याख्यान के लिए छात्र की उपस्थिति के बारे में डेटा संग्रहीत करने के लिए किया जाता है। हम मान सकते हैं कि प्रत्येक व्याख्यान के लिए प्रशिक्षक सभी छात्रों की उपस्थिति और/या अनुपस्थिति को नोट करेगा। तालिका में विशेषताएँ हैं:
student_id
-student
टेबलclass_schedule_id
-class_schedule
टेबलpresent
- एक बूलियन मार्किंग है कि छात्र व्याख्यान में मौजूद है या नहीं
हम एक विशिष्ट कक्षा पर छात्रों की उपस्थिति की निगरानी कर सकते हैं, जैसे कि निम्नलिखित प्रश्न (यह मानते हुए कि @id_class में वह वर्ग आईडी है जो हम चाहते हैं)।
चयन a.id, CONCAT(a.first_name, '' ', a.last_name) AS student_name, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') AS प्रतिशत, a.attendance_outcomeFROM(चुनें student.id, student.first_name, student.last_name, SUM(CASE जब student_presence.वर्तमान =सही तब 1 ELSE 0 END) AS number_वर्तमान, COUNT(DISTINCT class_schedule.id) AS नंबर_टोटल, अटेंडेंस_आउटकम.आउटकम_टेक्स्ट एएस अटेंडेंस_आउटकम फ्रॉम क्लास इनर जॉइन क्लास.आईडी पर अटेंड करें। .id AND student_presence.class_schedule_id =class_schedule.id LEFT जॉइन अटेंडेंस_आउटकम ऑन अटेंडेंस_आउटकम.आईडी =अटेंड करें।
"instructor_presence" तालिका "student_presence" तालिका के समान तर्क का उपयोग करती है, लेकिन यहां हम प्रशिक्षकों पर ध्यान केंद्रित करना चाहते हैं। तालिका में विशेषताएँ हैं:
instructor_id
-instructor
टेबलclass_schedule_id
-class_schedule
टेबलpresent
- एक बूलियन मान है जो दर्शाता है कि प्रशिक्षक व्याख्यान में उपस्थित है या नहीं
कक्षा में प्रशिक्षक की गतिविधि की निगरानी के लिए हम नीचे दी गई क्वेरी का उपयोग कर सकते हैं:
सेलेक्ट a.id, CONCAT(a.first_name, '', a.last_name) AS इंस्ट्रक्टर_नाम, a.number_total, CONCAT(CONVERT(a.number_present / a.number_total * 100, DECIMAL(5,2)), '%') प्रतिशत के रूप में, a.teach_outcomeFROM(चयन प्रशिक्षक.आईडी, प्रशिक्षक.प्रथम_नाम, प्रशिक्षक.अंतिम_नाम, योग(मामला जब प्रशिक्षक_उपस्थिति.वर्तमान =सत्य तब 1 ELSE 0 END) AS संख्या_वर्तमान, COUNT(DISTINCT class_schedule.id) AS number_total, tea_outcome.outcome_text के रूप में पढ़ाना_आउटकम से कक्षा INNER पर शामिल हों कक्षा.id पर पढ़ाएं। .id और इंस्ट्रक्टर_प्रेसेंस.क्लास_शेड्यूल_आईडी =class_schedule.id टीच_आउटकम पर टीच_आउटकम में बाएं शामिल हों।अब, संपर्क व्यक्ति तालिकाओं पर चर्चा करके समाप्त करते हैं।
हम किसे कॉल कर सकते हैं? संपर्क व्यक्ति तालिका
ज्यादातर मामलों में, हमें आपातकालीन संपर्क जानकारी संग्रहीत करने की आवश्यकता नहीं होती है (अर्थात आपात स्थिति के मामले में, इस व्यक्ति से संपर्क करें)। हालाँकि, यह तब बदल जाता है जब हम बच्चों को पढ़ा रहे होते हैं। कायदे से या प्रथा के अनुसार, हमारे द्वारा पढ़ाए जा रहे प्रत्येक बच्चे के लिए हमें एक संपर्क व्यक्ति की आवश्यकता होती है। हमारे मॉडल टेबल में –
contact_person
,contact_person_type
औरcontact_person_student
- हम प्रदर्शित करते हैं कि यह कैसे किया जा सकता है।
contact_person
तालिका उन लोगों की सूची है जो छात्रों से संबंधित हैं। बेशक, हमें सभी रिश्तेदारों को सूचीबद्ध करने की ज़रूरत नहीं है; अधिकतर हमारे पास प्रति छात्र एक या दो संपर्क होंगे। जब छात्र को जरूरत हो या जल्दी जाना हो तो "आप किसे कॉल करेंगे" को खोजने का यह एक अच्छा तरीका है। तालिका में विशेषताएँ हैं:
first_name
- संपर्क व्यक्ति का नाम हैlast_name
- व्यक्ति का उपनाम हैcontact_phone
- व्यक्ति का फ़ोन नंबर हैcontact_mobile
- व्यक्ति का मोबाइल फ़ोन नंबर हैcontact_mail
- व्यक्ति का ईमेल पता है
संपर्क विवरण अनिवार्य नहीं हैं, हालांकि वे बहुत उपयोगी हैं।
contact_person_type
तालिका एक एकल, आवश्यक विशेषता वाला एक शब्दकोश है:type_name
. इस तालिका में संग्रहीत मूल्यों के उदाहरण हैं:"माँ", "पिता", "भाई", "बहन" या "चाचा"।
contact_person_student
तालिका कई-से-अनेक संबंध है जो संपर्क व्यक्तियों और उनके प्रकार को छात्रों से जोड़ता है। तालिका में विशेषताएँ हैं (सभी अनिवार्य हैं):
contact_person_id
-contact_person
टेबलstudent_id
-student
टेबलcontact_person_type_id
-contact_person_type
टेबल
यह उल्लेखनीय हो सकता है कि यह कई-से-अनेक संबंध तीन तालिकाओं को एक साथ जोड़ता है। विशेषता जोड़ी contact_person_id
और student_id
वैकल्पिक (UNIQUE) कुंजी के रूप में प्रयोग किया जाता है। इस तरह, हम उन डुप्लिकेट प्रविष्टियों को अक्षम कर देंगे जो अलग-अलग छात्रों को एक ही संपर्क व्यक्ति से जोड़ती हैं। विशेषता contact_person_type_id
वैकल्पिक कुंजी का हिस्सा नहीं है। यदि ऐसा है, तो एक ही संपर्क व्यक्ति और एक ही छात्र (विभिन्न प्रकार के संबंधों का उपयोग करके) के लिए हमारे कई संबंध हो सकते हैं, और वास्तविक जीवन स्थितियों में इसका कोई मतलब नहीं है।
इस लेख में प्रस्तुत मॉडल सबसे आम जरूरतों को पूरा करने में सक्षम होना चाहिए। फिर भी, कुछ मामलों में मॉडल के कुछ हिस्सों को बाहर रखा जा सकता है, उदा। यदि हमारे छात्र वयस्क हैं तो हमें शायद पूरे संपर्क व्यक्ति खंड की आवश्यकता नहीं होगी। जैसा कि मैंने पहले कहा, हम समय के साथ इसमें सुधार करते रहेंगे। सुझाव जोड़ने और चर्चा अनुभागों में अपने अनुभव साझा करने के लिए स्वतंत्र महसूस करें।