2011-11-09 12 views
6

क्या कोई मुझे इस डेटाबेस संरचना को बनाने का विचार दे सकता है।कई तालिका के एकाधिक आईडी के साथ एसक्यूएल फ़ील्ड

Table "countries": 
id, countryname 
1, "US" 
2, "DE" 
3, "FR" 
4, "IT" 

अब मैं एक और तालिका "उत्पाद" है और वहाँ में मैं सभी देशों स्टोर करने के लिए जहां इस उत्पाद उपलब्ध है चाहते हैं:

Table "products": 
id,productname,countries 
1,"product1",(1,2,4) // available in countries US, DE, IT. 
2,"product2",(2,3,4) // available in countries DE, FR, IT. 

मेरा प्रश्न: कैसे करते यहाँ एक उदाहरण है मैं कई देशों को स्टोर करने में सक्षम होने के लिए "उत्पादों" में टेबल संरचना तैयार करता हूं?

मेरा सबसे अच्छा विचार है कि वहां अल्पविराम से अलग स्ट्रिंग डालें (यानी "1,2,4"), फिर प्रत्येक प्रविष्टि को देखने के लिए उस स्ट्रिंग को विभाजित करें। लेकिन मुझे संदेह है कि ऐसा करने का यह सबसे अच्छा तरीका है?

संपादित करें: आपकी मदद के लिए सभी को धन्यवाद, अद्भुत! सही उत्तर चुनना मुश्किल था, मैंने आखिरकार ग्रेग्स को चुना क्योंकि उन्होंने मुझे जॉइन स्पष्टीकरण के लिए इंगित किया और इसका उदाहरण दिया कि इसका उपयोग कैसे किया जाए।

उत्तर

9

आपको लगता है कि many-to-many रिश्ते के लिए एक चौराहे तालिका जरूरत जोड़ने की आवश्यकता होगी।

Table Country 
CountryID, CountryName 

Table CountryProduct 
CountryID, ProductID 

Table Product 
ProductID, ProductName 

फिर आप Inner Join सभी 3 टेबल देशों & उत्पाद की सूची प्राप्त करने के लिए।

Select * From Country 
Inner Join CountryProduct On Country.CountryID = CountryProduct.CountryID 
Inner Join Product On CountryProduct.ProductID = Product.ProductID 
1

आप फ़ील्ड country_id और product_id फ़ील्ड के साथ एक तीसरी तालिका देश_प्रॉडक्ट भी बना सकते हैं।

2

denormalizing के बिना, आप एक अतिरिक्त तालिका

Table Product countries 
ProductID CountryID 
1   1 
1   2 
1   4... 
2

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

यहाँ की स्थापना के एक उदाहरण है:

product_countries table 

productid | countryid 
----------+----------- 
1   | 1 
1   | 2 
1   | 4 
2   | 2 
2   | 3 
2   | 4 

आप एक दूसरे को मेज के लिए एक विदेशी कुंजी का उपयोग कर सकते हैं तो उन दोनों को एक समग्र प्राथमिक कुंजी में बनाते हैं।

फिर आप इस जैसे देश आईडी के लिए समर्थित उत्पादों की एक सूची प्राप्त कर सकते हैं:

SELECT * FROM products, product_countries 
WHERE products.id = product_countries.productid 
AND product_countries.countryid = $cid 
+0

क्यों शामिल होने का उपयोग नहीं कर रहे हैं? यह हमेशा मेरे लिए थोड़ा अजीब लग रहा है – Flo

+0

'जॉइन' का उपयोग करते समय तर्क एक एसक्यूएल नौसिखिया के लिए अधिक भ्रमित होगा, जो ओपी स्पष्ट रूप से है। निश्चित रूप से, 'जॉइन' भी काम करेगा, लेकिन इसके बिना तर्क स्पष्ट और समझने में आसान है। – Polynomial

+0

आपकी मदद करने के लिए और अन्य सभी को धन्यवाद !! हां, एसक्यूएल-न्यूबी यहाँ। एक सबक्वेस्टियन: एसक्यूएल-स्टेटमेंट मुझे धीमा लगता है - मान लीजिए कि मेरे पास 100000+ उत्पाद हैं, क्या उत्पादकंट्री के माध्यम से इसे फिर से शुरू करने में लंबा समय नहीं लगेगा? – marimba

1

रिलेशनल डेटाबेस के लिए सबसे अच्छा तरीका यह है:

एक coutries के लिए टेबल, मान लें कि country_id जाने , country_desc (country_id प्राथमिक है)

उत्पादों के लिए एक तालिका, मान लें कि product_id, product_desc और जितने चाहें उतने कॉलम (product_id प्राथमिक है)

यदि आपके पास निश्चित रूप से केवल एक देश था, तो यह प्रत्येक उत्पाद पंक्ति में country_id को इंगित करने वाली विदेशी कुंजी होने के लिए पर्याप्त होगा। एक विदेशी कुंजी होने का दावा है कि एक वास्तविक देश देश देश का जिक्र करते हुए देश_आईडी का व्यवहार कर रहा है।

आपके मामले में आप किसी उत्पाद के कई देशों में है, तो एक अलग संघ तालिका product_id जोड़ने के लिए,

दोनों कुंजी प्राथमिक और दोनों विदेशी के रूप में अच्छी country_id।