2012-08-02 13 views
6

मैं एक school.Here में छात्रों के एक डेटाबेस क्या मैं अब तक राशि है बनाने हूँ: enter image description hereअद्वितीय होने के लिए एक समग्र कुंजी कैसे बनाएं?

आप "संक्षेप में" भाग

समस्या के लिए कूद पढ़ने पसंद नहीं है यह है कि मैं इस डिजाइन से खुश नहीं हूं। मैं अद्वितीय होने के लिए grade, subgrade और id_class का संयोजन चाहता हूं और छात्रों की तालिका के लिए प्राथमिक कुंजी के रूप में कार्य करना चाहता हूं। मैं student_id को हटा सकता हूं और 3 से एक समग्र कुंजी बना सकता हूं लेकिन मुझे वह नहीं चाहिए। हो सकता है कि मुझे एक और टेबल बनाना चाहिए combination_id जहां grade, subgrade और id_class विदेशी कुंजी हैं और एक अतिरिक्त कॉलम comb_id है जो तालिका के लिए आईडी के रूप में कार्य करता है। और सभी कॉलम प्राथमिक कुंजी होंगे। लेकिन समस्या यह है कि उन 3 कॉलम अभी भी उस अतिरिक्त कॉलम (comb_id) के कारण दोहरा सकते हैं। उदाहरण के लिए, मेरे पास grade, subgrade और class_id लेकिन अलग-अलग comb_id हो सकते हैं जो तालिका के 4 कॉलम (combination_id) की समग्र कुंजी के कारण पंक्ति को वैध बनाएंगे।

संक्षेप में मैं students_id चाहते तालिका के केवल प्राथमिक कुंजी रहने के लिए लेकिन एक और तालिका जो किसी भी तरह grades, subgrade और class_id के अद्वितीय संयोजन है के लिए एक विदेशी कुंजी हो सकता है।

यदि मैं नीचे दी गई टिप्पणियों में पर्याप्त स्पष्ट नहीं था और अग्रिम धन्यवाद।

पुनश्च मैं indescriptive शीर्षक के लिए माफी चाहता हूँ, लेकिन मैं नामकरण

संपादित करें 1 पर बुरा कर रहा हूँ: subgrade करने के लिए एक हो सकता है 1 करने के लिए किया जा सकता है: अधिक स्पष्ट रूप से कहें j id_class 30 करने के लिए 1 होना कर सकते हैं और यह वर्ग

में अपना नंबर है तो एक छात्र 7b वर्ग से हो सकता है और कर सकते हैं कक्षा में उसका नंबर - 5

+0

मुझे समझ में नहीं आता है, क्या कक्षा में सभी छात्र अलग-अलग ग्रेड रखने के लिए तैयार हैं? – Jodrell

+0

छात्र कक्षा में परिवर्तन करते समय क्या करेंगे या क्या ऐसा कभी नहीं होता? – Jodrell

+0

'student_id' कॉलम में क्या गलत है? – Jodrell

उत्तर

17

अनन्य कुंजी और प्राथमिक कुंजी की अवधारणाओं को मिश्रित न करें। आप unique key को तीन कॉलम grades, subgrade और class_id पर फैलाकर बहुत अच्छी तरह से जोड़ सकते हैं। इस तरह, इन तीन कॉलमों के लिए कोई भी दो पंक्तियां could have समान मान नहीं हैं। जैसा कि आप लिखते हैं कि आप इन तीनों को एक समग्र प्राथमिक कुंजी के रूप में नहीं रखना चाहते हैं, मुझे यकीन नहीं है कि एक समग्र अद्वितीय पूरक कुंजी बेहतर होगी या नहीं। यदि नहीं, तो आपको समग्र कुंजी स्वीकार्य होने पर स्पष्ट करना होगा।

एक अद्वितीय कुंजी बनाने के लिए, आप निम्नलिखित एसक्यूएल statement उपयोग कर सकते हैं:

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id); 

शब्द gsc वहाँ सिर्फ एक नाम मैं कुंजी स्तंभों की नाम के पहले अक्षर से बना हुआ है; जो भी नाम आप चाहते हैं उसका उपयोग करें, क्योंकि यह मुश्किल से मायने रखता है जब तक आप कुछ EXPLAIN आउटपुट या इसी तरह की कुंजी की पहचान नहीं करना चाहते हैं।

+0

धन्यवाद मैं कोशिश करूँगा और मैंने शायद लोगों को 'ग्रेड', 'सबग्रेड' और' id_class' के नाम से भ्रमित कर दिया है, लेकिन मेरे देश में शिक्षा प्रणाली अलग है। – Bosak

+0

ठीक है मैंने कोशिश की लेकिन जब मैंने सभी 3 कॉलम 'अद्वितीय' बनाया तो मुझे डुप्लिकेट प्रविष्टियों के लिए त्रुटि मिली। मेरे पास कई 'ग्रेड' 3 थे लेकिन उनके पास अलग-अलग' सबग्रेड्स 'थे, इसलिए उन्होंने उन्हें अलग-अलग' अद्वितीय 'कुंजी के रूप में माना। पूरक भी क्या है? – Bosak

+0

सभी थ्रे कॉलम स्वयं को अद्वितीय न बनाएं, लेकिन साथ में: 'वैकल्पिक तालिका के छात्र अद्वितीय जीएससी (ग्रेड, सबग्रेड, क्लास_आईडी) जोड़ें। 'जीएससी' सिर्फ एक नाम है, जो कुछ भी आपको पसंद है उसका उपयोग करें। फिर डुप्लिकेट केवल तब होता है जब सभी तीन समान होते हैं। मैंने * प्राथमिक * के विपरीत * अनुपूरक * शब्द का उपयोग किया: इस आदेश का उपयोग करके परिभाषित एक कुंजी प्राथमिक नहीं है, लेकिन अभी भी अद्वितीय है। – MvG

2

मैं पूरी तरह से स्पष्ट नहीं हूं कि आप जो चाहते हैं उसे क्यों चाहते हैं, लेकिन मैं निम्नलिखित तरीके से मॉडल को देखूंगा ...

आपके पास छात्र
- वे अलग संस्थाओं, अन्य संस्थाओं की नहीं एक समग्र हैं
- वे अपने स्वयं के गुण होते हैं; नाम, जन्म तिथि, आदि

आप कक्षाएं
है - इन छात्रों
के समूह हैं - हर साल एक ही accademic "वर्ग" उस में विभिन्न छात्र हैं
- वे भी अपने स्वयं के गुण होते हैं; ग्रेड, उप ग्रेड, आदि

आप अपने मॉडल में एक अतिरिक्त संपत्ति है कि मैं सामान्य रूप से
का उपयोग नहीं होता है - एक वर्ग 20 छात्रों, उनमें से प्रत्येक 20

1 से एक माध्यमिक आईडी के साथ की पहचान की है है


यह मुझे निम्नलिखित आयाम तालिकाओं

Student     Class      Grade    SubGrade 
----------------------- ------------------------ ----------------- ----------------- 
id   INT PK  id   INT PK  id INT PK  id INT PK 
first_name VARCHAR(45) name   VARCHAR(45) name VARCHAR(45) name VARCHAR(45) 
last_name VARCHAR(45) grade_id  INT FK  desc VARCHAR(45) desc VARCHAR(45) 
etc, etc     subgrade_id INT FK  etc, etc   etc, etc 

Class तालिका डब्ल्यू देना होगा (grade_id, subgrade_id) पर एक अनूठी बाधा हो सकती है ताकि केवल एक वर्ग 7b हो।

तो फिर तुम अपनी कक्षाओं एक तथ्य तालिका का उपयोग करने के लिए छात्रों से संबंधित करने की जरूरत है ...

Class_Membership 
----------------------- 
id    INT PK 
student_id  INT FK 
class_id   INT FK 
academic_year INT 

एक छात्र ही कभी किसी भी शैक्षणिक वर्ष में एक कक्षा में होना चाहिए, तो आप एक अद्वितीय बाधा पर डाल दिया जाएगा (student_id, academic_year)

वैकल्पिक रूप से, आप Class तालिका में अकादमिक वर्ष प्राप्त कर सकते हैं। इसका मतलब यह होगा कि आपके पास प्रत्येक वर्ष के लिए एक ही कक्षा दोहराई जाएगी, लेकिन कुछ वर्षों में कक्षा 7gमौजूद नहीं हो सकती है (उदाहरण के लिए उस वर्ष कम छात्र हैं, उदाहरण के लिए)

समान रूप से, आपके पास ऐसे छात्र हो सकते हैं जो 7b से 7c मध्य वर्ष तक स्थानांतरित हो सकें। इस मामले में Class_Membership तालिका में start_date फ़ील्ड और संभवतः end_date फ़ील्ड हो सकता है। इस बात का


कोई नहीं है, तथापि, सीधे id_class क्षेत्र (1-20 20 छात्रों के साथ एक वर्ग के लिए) बनाता है। व्यक्तिगत रूप से मेरे पास ऐसा क्षेत्र नहीं होगा, id फ़ील्ड Class_Membership तालिका से समान कार्यक्षमता, और शायद अतिरिक्त कार्यक्षमता प्रदान कर सकता है। यह कहाँ आवश्यक है, हालांकि, आप बस इसे Class_Membership तालिका में जोड़ सकता है ...

Class_Membership 
----------------------- 
id    INT PK 
student_id  INT FK 
class_id   INT FK 
academic_year INT 
class_member_id INT 

तो फिर तुम भी (academic_year, class_id, class_member_id) पर एक अद्वितीय बाधा हो सकता था।


वहाँ अपने सटीक वास्तविक दुनिया-मॉडल और अपने विशेष जरूरतों के आधार पर, यहाँ काफी लचीलापन का एक बहुत है।लेकिन उम्मीद है कि यह उदाहरण आपके लिए अच्छी शुरुआत है; आयाम सारणी प्रविष्टियों, और इन इकाइयों से संबंधित एक तथ्य तालिका (या तालिकाओं) एक साथ और/या संस्थाओं का आगे वर्णन।

+1

जब आप स्कीमा को खड़ा करते हैं, तो मैं यहां अपने विचार जोड़ूंगा। @ बोसाक, मेरी समझ में "सबग्रेड" एक ही ग्रेड में विभिन्न वर्गों को अलग करने के लिए केवल एक पत्र है। इसलिए ग्रेड और सबग्रेड एक वर्ग की पहचान करते समय, स्वयं द्वारा एक सबग्रेड वास्तव में एक इकाई नहीं है। आपको "सबग्रेड बी के साथ सभी कक्षाओं" में शायद ही कभी दिलचस्पी होगी, और उन सभी वर्गों के लिए सामान्य विशेषताओं को संग्रहीत करने में भी कम रुचि है, है ना? उस स्थिति में, मैं सबग्रेड टेबल छोड़ दूंगा। – MvG

0
alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>) 

Modified the answer due to syntax mistakes. Mentioned above is correct. 
संबंधित मुद्दे