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

एक ही टेबल में एकाधिक विकल्प कैसे स्टोर करें?

कृपया डेटा सामान्यीकरण पर पढ़ें , सामान्य अनुक्रमण अवधारणाएं, और विदेशी कुंजी संदर्भात्मक अखंडता के साथ डेटा को साफ रखने के लिए बाधाएं। यह आपको जाने देगा।

सरणियों में डेटा संग्रहीत करना आपको कागज पर स्वाभाविक लग सकता है, लेकिन डीबी इंजन के लिए प्रदर्शन ज्यादातर बिना सूचकांक के उपयोग के हो सकता है। इसके अलावा, दूसरे दिन आप पाएंगे कि आपका डेटा प्राप्त करना और उसका रखरखाव करना एक बुरे सपने जैसा होगा।

जैसा कि आप टिंकर करते हैं, निम्नलिखित आपको एक अच्छी शुरुआत के साथ आगे बढ़ना चाहिए। जुड़ता है भी।

create table student
(   studentId int auto_increment primary key,
    fullName varchar(100) not null
    -- etc
);

create table dept
(   deptId int auto_increment primary key,
    deptName varchar(100) not null -- Economics
    -- etc
);

create table course
(   courseId int auto_increment primary key,
    deptId int not null,
    courseName varchar(100) not null,
    -- etc
    CONSTRAINT fk_crs_dept FOREIGN KEY (deptId) REFERENCES dept(deptId)
);

create table SCJunction
(   -- Student/Course Junction table (a.k.a Student is taking the course)
    -- also holds the attendance and grade
    id int auto_increment primary key,
    studentId int not null,
    courseId int not null,
    term int not null, -- term (I am using 100 in below examples for this term)
    attendance int not null, -- whatever you want, 100=always there, 0=he must have been partying,
    grade int not null, -- just an idea   
    -- See (Note Composite Index) at bottom concerning next two lines.
    unique key(studentId,courseId,term), -- no duplicates allowed for the combo (note student can re-take it next term)
    key (courseId,studentId),
    CONSTRAINT fk_sc_student FOREIGN KEY (studentId) REFERENCES student(studentId),
    CONSTRAINT fk_sc_courses FOREIGN KEY (courseId) REFERENCES course(courseId)
);

परीक्षण डेटा बनाएं

insert student(fullName) values ('Henry Carthage'),('Kim Billings'),('Shy Guy'); -- id's 1,2,3
insert student(fullName) values ('Shy Guy');

insert dept(deptName) values ('History'),('Math'),('English'); -- id's 1,2,3

insert course(deptId,courseName) values (1,'Early Roman Empire'),(1,'Italian Nation States'); -- id's 1 and 2 (History dept)
insert course(deptId,courseName) values (2,'Calculus 1'),(2,'Linear Algebra A'); -- id's 3 and 4 (Math dept)
insert course(deptId,courseName) values (3,'World of Chaucer'); -- id 5 (English dept)

-- show why FK constraints are important based on data at the moment
insert course(deptId,courseName) values (66,'Fly Fishing 101'); -- will generate error 1452. That dept 66 does not exist
-- That error is a good error to have. Better than faulty data

-- Have Kim (studentId=2) enrolled in a few courses
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,1,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknown attendance/grade
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,4,100,-1,-1); -- Linear Algebra A
insert SCJunction(studentId,courseId,term,attendance,grade) values (2,5,100,-1,-1); -- World of Chaucer

-- Have Shy Guy (studentId=3) enrolled in one course only. He is shy
insert SCJunction(studentId,courseId,term,attendance,grade) values (3,5,100,-1,-1); -- Early Roman Empire, term 100 (made up), unknow attendance/grade
-- note if you run that line again, the Error 1062 Duplicate entry happens. Can't take same course more than once per term

कुछ आसान सवाल।

किस विभाग में कोर्स है?

सभी दिखाएं, टाइपिंग को कम, पठनीयता (कभी-कभी) बेहतर बनाने के लिए टेबल एलियासेस (संक्षिप्त रूप) का उपयोग करता है

select c.courseId,c.courseName,d.deptId,d.deptName
from course c
join dept d
on c.deptId=d.deptId
order by d.deptName,c.courseName -- note the order
+----------+-----------------------+--------+----------+
| courseId | courseName            | deptId | deptName |
+----------+-----------------------+--------+----------+
|        5 | World of Chaucer      |      3 | English  |
|        1 | Early Roman Empire    |      1 | History  |
|        2 | Italian Nation States |      1 | History  |
|        3 | Calculus 1            |      2 | Math     |
|        4 | Linear Algebra A      |      2 | Math     |
+----------+-----------------------+--------+----------+

इस टर्म में वर्ल्ड ऑफ चॉसर कोर्स कौन ले रहा है?

(पाठ्यक्रम जानना आईडी=5)

एससीजंक्शन में हमारे एक संयुक्त सूचकांक से नीचे लाभ। एक कंपोजिट एक से अधिक कॉलम पर एक इंडेक्स है।

select s.StudentId,s.FullName
from SCJunction j
join student s
on j.studentId=s.studentId
where j.courseId=5 and j.term=100
+-----------+--------------+
| StudentId | FullName     |
+-----------+--------------+
|         2 | Kim Billings |
|         3 | Shy Guy      |
+-----------+--------------+

किम बिलिंग्स इस पद के लिए नामांकित हैं?

select s.StudentId,s.FullName,c.courseId,c.courseName
from SCJunction j
join student s
on j.studentId=s.studentId
join course c
on j.courseId=c.courseId
where s.studentId=2 and j.term=100
order by c.courseId DESC -- descending, just for the fun of it
+-----------+--------------+----------+--------------------+
| StudentId | FullName     | courseId | courseName         |
+-----------+--------------+----------+--------------------+
|         2 | Kim Billings |        5 | World of Chaucer   |
|         2 | Kim Billings |        4 | Linear Algebra A   |
|         2 | Kim Billings |        1 | Early Roman Empire |
+-----------+--------------+----------+--------------------+

किम अभिभूत हैं, इसलिए गणित की कक्षा छोड़ दें

delete from SCJunction
where studentId=2 and courseId=4 and term=100

किम क्या ले रहा है, यह दिखाते हुए ऊपर दिए गए चयन कथन को चलाएं:

+-----------+--------------+----------+--------------------+
| StudentId | FullName     | courseId | courseName         |
+-----------+--------------+----------+--------------------+
|         2 | Kim Billings |        5 | World of Chaucer   |
|         2 | Kim Billings |        1 | Early Roman Empire |
+-----------+--------------+----------+--------------------+

आह, बहुत आसान शब्द। हालांकि पिताजी खुश नहीं होंगे।

SCJunction.term जैसी बातों पर ध्यान दें। इसके बारे में बहुत कुछ लिखा जा सकता है, मैं इस समय ज्यादातर इसे छोड़ दूंगा, यह कहने के अलावा कि यह कहीं FK में भी होना चाहिए। आप चाहते हैं कि आपका शब्द अधिक SPRING2015 जैसा दिखे, न कि एक इंट।

और जहां तक ​​आईडी की बात है। मैं इसे इस तरह से करूंगा। यह व्यक्तिगत पसंद है। इसके लिए id # जानने की आवश्यकता होगी, उन्हें ढूंढ़ना। अन्य लोग HIST101 जैसा कोई कोर्स चुन सकते हैं और 17 नहीं। वे बहुत अधिक पठनीय हैं (लेकिन इंडेक्स में धीमे हैं (मुश्किल से)। तो वही करें जो आपके लिए सबसे अच्छा है।

नोट कम्पोजिट इंडेक्स

एक समग्र सूचकांक (INDEX का अर्थ है कुंजी, और इसके विपरीत) वह है जो तेजी से डेटा पुनर्प्राप्ति के लिए कई स्तंभों को जोड़ता है। एससीजंक्शन तालिका में दो कंपोजिट के लिए ऑर्डर फ़्लिप किए जाते हैं ताकि, आपके डेटा के बाद जाने वाले प्रश्नों के ब्रह्मांड के आधार पर, डीबी इंजन चुन सकता है कि आप सबसे बाएं कॉलम के आधार पर सबसे तेज़ पुनर्प्राप्ति के लिए किस इंडेक्स का उपयोग करना चाहते हैं। ।

अद्वितीय कुंजी, # 1 के लिए, इसके आगे की टिप्पणी कोई डुप्लिकेट (अर्थात् जंक डेटा) को लागू करने के बारे में बताती है, बल्कि आत्म-व्याख्यात्मक है। उदाहरण के लिए, छात्र 1 कोर्स 1 टर्म 1 उस तालिका में दो बार मौजूद नहीं हो सकता।

समझने के लिए एक महत्वपूर्ण अवधारणा है left-most . की अवधारणा किसी अनुक्रमणिका में स्तंभ नामों का क्रम।

studentId . के बाद आने वाले प्रश्नों के लिए केवल , फिर वह कुंजी जिसमें studentId . है पहले सूचीबद्ध (left-most ) प्रयोग किया जाता है। उन प्रश्नों में जो courseId . के बाद जाते हैं केवल , फिर वह कुंजी जिसमें courseId . है लेफ्ट-मोस्ट का उपयोग किया जाता है। उन प्रश्नों में जो छात्र आईडी और पाठ्यक्रम आईडी दोनों के बाद जाते हैं, डीबी इंजन तय कर सकता है कि किस समग्र कुंजी का उपयोग करना है।

जब मैं कहता हूं "आफ्टर जाओ", मेरा मतलब है on clause या where clause हालत।

क्या उन दो संयुक्त कुंजियों (उनमें कॉलम 1 और 2 फ़्लिप के साथ) नहीं थे, तो उन प्रश्नों में जहां मांगा गया कॉलम left-most नहीं है अनुक्रमित, आपको कुंजी उपयोग से कोई लाभ नहीं होगा, और डेटा वापस आने के लिए एक धीमी टेबलस्कैन का सामना करना पड़ेगा।

तो, वे दो अनुक्रमणिका निम्नलिखित 2 अवधारणाओं को जोड़ती हैं

  • सबसे बाएं या दोनों (छात्र आईडी और पाठ्यक्रम आईडी कॉलम) के आधार पर तेजी से डेटा पुनर्प्राप्ति
  • स्टूडेंट आईडी, कोर्स आईडी और टर्म वैल्यू के आधार पर उस टेबल में डेटा के गैर-डुप्लिकेशंस को लागू करना

द टेकअवे

महत्वपूर्ण टेकअवे यह है कि जंक्शन टेबल त्वरित अनुक्रमणिका पुनर्प्राप्ति के लिए बनाते हैं, और डेटा बनाम अल्पविराम-सीमांकित डेटा (सरणी मानसिकता) के समझदार प्रबंधन को एक कॉलम में समेट दिया जाता है, और इस तरह के निर्माण का उपयोग करने के सभी दुख।



  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 में दो तिथियों के बीच अंतर की गणना कैसे करें

  2. MySQL में सिग्नेचर कैसे सेव करें

  3. मैसकल रो साइज के लिए चेंज लिमिट बहुत बड़ी है

  4. लिनक्स के लिए 12 MySQL/MariaDB सुरक्षा सर्वोत्तम अभ्यास

  5. MySQL इन्सर्ट इन सेलेक्ट