कई-से-अनेक संबंधों का उपयोग करते समय, इसे संभालने का एकमात्र यथार्थवादी तरीका मानचित्रण तालिका है।
मान लें कि हमारे पास शिक्षकों और छात्रों के साथ एक स्कूल है, एक छात्र के पास कई शिक्षक हो सकते हैं और इसके विपरीत वीजा।
तो हम 3 टेबल बनाते हैं
student
id unsigned integer auto_increment primary key
name varchar
teacher
id unsigned integer auto_increment primary key
name varchar
link_st
student_id integer not null
teacher_id integer not null
primary key (student_id, teacher_id)
छात्र तालिका में 1000 रिकॉर्ड होंगे
शिक्षक तालिका में 20 रिकॉर्ड होंगे
लिंक_स्ट तालिका में उतने रिकॉर्ड होंगे जितने लिंक हैं (20x1000 नहीं, बल्कि केवल वास्तविक लिंक के लिए)।
चयन
आप चुनें उदा. छात्र प्रति शिक्षक का उपयोग कर रहे हैं:
SELECT s.name, t.name
FROM student
INNER JOIN link_st l ON (l.student_id = s.id) <--- first link student to the link-table
INNER JOIN teacher t ON (l.teacher_id = t.id) <--- then link teacher to the link table.
ORDER BY t.id, s.id
आम तौर पर आपको हमेशा आंतरिक जुड़ाव
का उपयोग करना चाहिए यहाँ।
लिंक बनाना
जब आप किसी छात्र को शिक्षक असाइन करते हैं (या वीज़ा इसके विपरीत, यह वही है) .आपको बस इतना करना है:
INSERT INTO link_st (student_id, teacher_id)
SELECT s.id, t.id
FROM student s
INNER JOIN teacher t ON (t.name = 'Jones')
WHERE s.name = 'kiddo'
यह एक आंतरिक जुड़ाव का थोड़ा सा दुरुपयोग है, लेकिन यह तब तक काम करता है जब तक नाम अद्वितीय हैं।
यदि आप आईडी जानते हैं, तो आप उन्हें सीधे सीधे सम्मिलित कर सकते हैं।
यदि नाम हैं अद्वितीय नहीं यह एक असफल होगा और इस्तेमाल नहीं किया जाना चाहिए।
डुप्लिकेट लिंक से कैसे बचें
डुप्लिकेट लिंक से बचना बहुत महत्वपूर्ण है, यदि आपके पास वे हैं तो सभी प्रकार की बुरी चीजें होंगी।
यदि आप अपनी लिंक तालिका में डुप्लिकेट लिंक डालने से रोकना चाहते हैं, तो आप एक अद्वितीय<घोषित कर सकते हैं /कोड> लिंक पर अनुक्रमणिका (अनुशंसित)
ALTER TABLE link_st
ADD UNIQUE INDEX s_t (student_id, teacher_id);
या आप इन्सर्ट स्टेटमेंट में चेक कर सकते हैं (वास्तव में अनुशंसित नहीं है, लेकिन यह काम करता है)।
INSERT INTO link_st (student_id, teacher_id)
SELECT s.id, t.id
FROM student s
INNER JOIN teacher t ON (t.id = 548)
LEFT JOIN link_st l ON (l.student_id = s.id AND l.teacher_id = t.id)
WHERE (s.id = 785) AND (l.id IS NULL)
यह केवल 548, 785 यदि . का चयन करेगा वह डेटा पहले से link_st
. में नहीं है तालिका, और कुछ भी नहीं लौटाएगा यदि वह डेटा पहले से link_st में है। तो यह डुप्लिकेट मान डालने से मना कर देगा।
यदि आपके पास एक टेबल स्कूल है, तो यह निर्भर करता है कि क्या एक छात्र को कई स्कूलों में नामांकित किया जा सकता है (संभावना नहीं है, लेकिन मान लें) और शिक्षकों को कई स्कूलों में नामांकित किया जा सकता है। बहुत संभव है।
table school
id unsigned integer auto_increment primary key
name varchar
table school_members
id id unsigned integer auto_increment primary key
school_id integer not null
member_id integer not null
is_student boolean not null
आप किसी स्कूल के सभी विद्यार्थियों को इस प्रकार सूचीबद्ध कर सकते हैं:
SELECT s.name
FROM school i
INNER JOIN school_members m ON (i.id = m.school_id)
INNER JOIN student s ON (s.id = m.member_id AND m.is_student = true)