मान लें कि हम Auto Increment id
. का उपयोग करना जारी रखते हैं प्राथमिक कुंजी के रूप में कॉलम। अब, हमें यह भी सुनिश्चित करना होगा कि डेटा सुसंगत है, अर्थात , (student_id, course_id)
के संयोजन के लिए कोई डुप्लीकेट पंक्तियां नहीं हैं मूल्य। इसलिए, हमें या तो इसे एप्लिकेशन कोड में संभालना होगा (सम्मिलित/अपडेट करने से पहले हर बार एक चयन करें), या हम एक समग्र UNIQUE
को परिभाषित करके इस चीज़ को संरचनात्मक रूप से ठीक कर सकते हैं। (student_id, course_id)
. पर प्रतिबंध ।
अब, एक प्राथमिक कुंजी मूल रूप से एक अद्वितीय नहीं पूर्ण कुंजी है। यदि आप अपनी तालिका परिभाषा को देखते हैं, तो यह नई परिभाषित अद्वितीय बाधा मूल रूप से केवल प्राथमिक कुंजी है (क्योंकि फ़ील्ड भी न्यूल नहीं हैं)। तो, इस विशेष मामले में, आपको वास्तव में एक सरोगेट प्राथमिक कुंजी id
का उपयोग करने की आवश्यकता नहीं है .
रैंडम डीएमएल (इन्सर्ट/अपडेट/डिलीट) के दौरान ओवरहेड्स में अंतर न्यूनतम होगा, क्योंकि केवल UNIQUE इंडेक्स का उपयोग करते समय आपके समान ओवरहेड्स भी होंगे। तो, आप इसके बजाय एक प्राकृतिक प्राथमिक समग्र कुंजी (student_id, course_id)
परिभाषित कर सकते हैं :
-- Drop the id column
ALTER TABLE students_courses DROP COLUMN id;
-- Add the composite Primary Key
ALTER TABLE students_courses ADD PRIMARY(student_id, course_id);
ऊपर (student_id, course_id)
के संयोजन पर UNIQUE बाधा भी लागू करेगा . इसके अलावा, आप 4 बाइट बचाएंगे प्रति पंक्ति (int
. का आकार 4 बाइट्स है)। यह तब काम आएगा जब आपके पास बड़ी टेबल होंगी।
अब, students
. से जुड़ते समय students_courses
. के लिए तालिका, प्राथमिक कुंजी के ऊपर एक पर्याप्त अनुक्रमणिका होगी। हालांकि, अगर आपको courses
. से शामिल होने की आवश्यकता है students_courses
. के लिए तालिका, इस उद्देश्य के लिए आपको एक और कुंजी की आवश्यकता होगी। तो, आप course_id
. पर एक और कुंजी परिभाषित कर सकते हैं इस प्रकार:
ALTER TABLE students_courses ADD INDEX (course_id);
इसके अलावा, आपको डेटा अखंडता सुनिश्चित करने के लिए विदेशी कुंजी बाधाओं को परिभाषित करना चाहिए:
ALTER TABLE students_courses ADD FOREIGN KEY (student_id)
REFERENCES students(student_id);
ALTER TABLE students_courses ADD FOREIGN KEY (course_id)
REFERENCES courses(course_id);