कहने का मतलब है कि "Composite keys as PRIMARY KEY is bad practice"ister बकवास का उपयोग !
समग्र PRIMARY KEYएस अक्सर एक "बहुत अच्छी बात" होती है और रोजमर्रा की जिंदगी में आने वाली प्राकृतिक स्थितियों को मॉडल करने का एकमात्र तरीका है!
क्लासिक डेटाबेस -१०१ छात्रों और पाठ्यक्रमों और कई छात्रों द्वारा उठाए गए कई पाठ्यक्रमों के शिक्षण उदाहरण के बारे में सोचो!
टेबल कोर्स और छात्र बनाएँ:
CREATE TABLE course
(
course_id SERIAL,
course_year SMALLINT NOT NULL,
course_name VARCHAR (100) NOT NULL,
CONSTRAINT course_pk PRIMARY KEY (course_id)
);
CREATE TABLE student
(
student_id SERIAL,
student_name VARCHAR (50),
CONSTRAINT student_pk PRIMARY KEY (student_id)
);
मैं आपको PostgreSQL बोली (और MySQL ) में उदाहरण दूंगा - किसी भी सर्वर के लिए थोड़ा सा काम करना चाहिए।
अब, आप स्पष्ट रूप से इस बात का ध्यान रखना चाहते हैं कि कौन सा छात्र कौन सा पाठ्यक्रम ले रहा है - इसलिए आपने क्या कहा है joining table(इसे भी कहा जाता है linking, many-to-manyया m-to-nटेबल)। उन्हें associative entitiesअधिक तकनीकी शब्दजाल के रूप में भी जाना जाता है!
1 पाठ्यक्रम में कई छात्र हो सकते हैं ।
1 छात्र कई पाठ्यक्रम ले सकता है ।
तो, आप एक ज्वाइनिंग टेबल बनाएं
CREATE TABLE course_student
(
cs_course_id INTEGER NOT NULL,
cs_student_id INTEGER NOT NULL,
-- now for FK constraints - have to ensure that the student
-- actually exists, ditto for the course.
CREATE CONSTRAINT cs_course_fk FOREIGN KEY (cs_course_id) REFERENCES course (course_id),
CREATE CONSTRAINT cs_student_fk FOREIGN KEY (cs_student_id) REFERENCES student (student_id)
);
अब, इस तालिका को समझदारी से देने का एकमात्र तरीका यह PRIMARY KEYहै कि KEYपाठ्यक्रम और छात्र का एक संयोजन बनाया जाए। इस तरह, आप प्राप्त नहीं कर सकते हैं:
छात्र और पाठ्यक्रम संयोजन की नकल
एक पाठ्यक्रम केवल एक ही छात्र एक बार नामांकित हो सकता है, और
एक छात्र केवल एक समय में एक ही पाठ्यक्रम में दाखिला ले सकता है
आपके पास KEYप्रति छात्र पाठ्यक्रम पर एक तैयार की गई खोज है - AKA एक कवरिंग इंडेक्स ,
यह उन छात्रों और छात्रों के बिना पाठ्यक्रम खोजने के लिए तुच्छ है जो कोई पाठ्यक्रम नहीं ले रहे हैं!
- db-fiddle उदाहरण पीके बाधा क्रिएट टेबल में मुड़ा हुआ है - यह किसी भी तरह से किया जा सकता है। मैं क्रिएट टेबल स्टेटमेंट में सब कुछ रखना पसंद करता हूं।
ALTER TABLE course_student
ADD CONSTRAINT course_student_pk
PRIMARY KEY (cs_course_id, cs_student_id);
अब, आप कर सकते हैं, यदि आप पा रहे थे कि निश्चित रूप से छात्र की खोज धीमी थी, तो UNIQUE INDEXऑन (sc_student_id, sc_course_id) का उपयोग करें।
ALTER TABLE course_student
ADD CONSTRAINT course_student_sc_uq
UNIQUE (cs_student_id, cs_course_id);
नहीं है कोई अनुक्रमणिका जोड़ने के लिए चांदी की गोली - वे होगा बनाने INSERTऔर UPDATEधीमी है, लेकिन बेहद के महान लाभ में कमी आतीSELECT बार! यह डेवलपर पर निर्भर है कि वह अपने ज्ञान और अनुभव को देखते हुए अनुक्रमणिका तय करे, लेकिन यह कहना कि कंपोजिट PRIMARY KEYएस हमेशा खराब होता है, केवल सादा गलत है।
तालिकाओं में शामिल होने के मामले में, वे आमतौर पर एकमात्र हैं PRIMARY KEY जो समझ में आते हैं! जॉइनिंग टेबल भी अक्सर मॉडलिंग का एकमात्र तरीका है जो व्यवसाय या प्रकृति या वास्तव में हर क्षेत्र में होता है जिसके बारे में मैं सोच सकता हूं!
यह पीके भी उपयोग के रूप में है covering indexजो खोजों को गति देने में मदद कर सकता है। इस मामले में, यह विशेष रूप से उपयोगी होगा यदि कोई नियमित रूप से (कोर्स_ड, स्टूडेंट_ड) पर खोज कर रहा था, जो कि कल्पना करेगा, अक्सर ऐसा हो सकता है!
यह सिर्फ एक छोटा सा उदाहरण है जहां एक समग्र PRIMARY KEYएक बहुत अच्छा विचार हो सकता है, और वास्तविकता को मॉडल करने का एकमात्र तरीका है! मेरे सिर के ऊपर से, मैं कई और अधिक के बारे में सोच सकता हूं ।
मेरे अपने काम से एक उदाहरण!
फ्लाइट टेबल पर विचार करें, जिसमें फ़्लाइट_आईडी, प्रस्थान और आगमन हवाई अड्डों की सूची और प्रासंगिक समय हो और फिर क्रू सदस्यों के साथ एक केबिन_ क्रू टेबल भी हो!
एकमात्र ऐसा तरीका जिसे मॉडलिंग किया जा सकता है, उसके पास उड़ान_ के साथ एक उड़ान_ क्रू टेबल है और चालक दल के रूप में एटिब्यूट्स और एकमात्र फलक PRIMARY KEYदो क्षेत्रों की समग्र कुंजी का उपयोग करना है!