Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL:मैपिंग टेबल को समझना

कई-से-अनेक संबंधों का उपयोग करते समय, इसे संभालने का एकमात्र यथार्थवादी तरीका मानचित्रण तालिका है।

मान लें कि हमारे पास शिक्षकों और छात्रों के साथ एक स्कूल है, एक छात्र के पास कई शिक्षक हो सकते हैं और इसके विपरीत वीजा।

तो हम 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)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्या MySQL में SQL सर्वर की @@ त्रुटि के बराबर है?

  2. कैसे पता चलेगा कि एक MySQL अद्यतन क्वेरी विफल हो जाती है क्योंकि आपूर्ति की जा रही जानकारी डेटाबेस में पहले से मौजूद डेटा से मेल खाती है?

  3. MySQL वर्कबेंच ट्यूटोरियल - RDBMS टूल के लिए एक व्यापक गाइड

  4. PHP MySQL mysql_fetch_assoc सरणी कुंजियों के साथ 'के रूप में' पदनामों द्वारा प्रतिष्ठित

  5. एक क्वेरी के साथ कई पंक्तियों को अपडेट करें?