MySQL

2010-04-13 4 views
5

में कई से कई रिश्ते मैं विदेशी कुंजी पर पढ़ रहा हूं और हाल ही में शामिल हो रहा हूं, और सुखद आश्चर्यचकित हूं कि कई बुनियादी अवधारणाएं हैं जो मैं पहले से ही अभ्यास में डाल रहा हूं। उदाहरण के लिए, एक परियोजना के साथ मैं वर्तमान पर काम कर रहा हूँ, मैं शब्द सूचियों का आयोजन कर रहा हूँ, और सेट के लिए एक मेज है, तो जैसे:MySQL

`words` Table 
    `word_id` 
    `headword` 
    `category_id` 
`categories` Table 
    `category_id` 
    `category_name` 

अब, आम तौर पर बोल रहा है इसे एक एकल हैं- होगा कई रिश्तों, कई शब्दों को एक ही श्रेणी के तहत विदेशी कुंजी category_id के साथ रखा जा रहा है। आइए एक पल के लिए मान लें, हालांकि, उपयोगकर्ता किसी अन्य शब्द को किसी शब्द में जोड़ने का विकल्प चुनता है, जिससे इसे कई से अधिक बनाते हैं- क्या तालिका को अतिरिक्त कॉलम बनाने के बिना category_2 जैसे शब्दों के लिए अतिरिक्त श्रेणियों को संभालने का कोई तरीका है , category_3, आदि?

उत्तर

12

आमतौर पर आप इन मैपिंग को संभालने के लिए एक अलग तालिका है:

`Words_Categories` Table 
    `word_id` 
    `category_id` 

इस Words_Categories तालिका में प्रत्येक जोड़ी किसी अन्य वर्ग के लिए किसी भी शब्द से एक संभव मानचित्रण प्रतिनिधित्व करता है।

category_idWords तालिका में फ़ील्ड इस योजना के तहत अनियंत्रित हो जाती है, क्योंकि इनमें से कोई भी तालिका सीधे एक दूसरे का संदर्भ नहीं देती है।

+0

क्या यह हमेशा कई से अधिक शामिल टेबल के लिए बहुवचन के साथ है? कम से कम, यह सम्मेलन है? – Thufir

4

आप शब्द तालिका से श्रेणी_आईडी को हटा देंगे और word_ategory, word_id (word_id (आमतौर पर अद्वितीय अनुक्रमणिका या बाधा) युक्त शब्दकोष तालिका होगी जिसे आमतौर पर लिंक तालिका या पुल तालिका कहा जाता है। यह कई से अधिक रिश्ते के लिए सामान्य सामान्यीकृत संरचना है।

शब्द तालिका में एकाधिक श्रेणी_आईडी कॉलम होने के कारण कई कारणों से सलाह नहीं दी जाती है, यही कारण है कि सामान्य रूप पंक्तियों में संग्रहीत होने से "सरणी" को खत्म करते हैं।

+0

"आमतौर पर एक लिंक टेबल या ब्रिज टेबल कहा जाता है" यहां शब्दावली जोड़ने के लिए धन्यवाद। –

6

आपको श्रेणी 2 और श्रेणी_3 जैसे अतिरिक्त कॉलम नहीं बनाना चाहिए। इस तरह पागलपन निहित है।

इसके बजाय, आप "शब्द" तालिका से कॉलम "श्रेणी_आईडी" को हटा देंगे। फिर, आप कॉलम "श्रेणी_आईडी" और "word_id" कॉलम के साथ एक नई तालिका "category_words" बनायेंगे। किसी शब्द को किसी श्रेणी में रखने के लिए, इस तालिका में एक रिकॉर्ड डालें। एक ही शब्द को किसी अन्य श्रेणी में रखने के लिए, तालिका में एक और रिकॉर्ड डालें।

+4

+1 "उस तरह पागलपन है!" ;) – FrustratedWithFormsDesigner