2009-09-14 6 views
9

मान लें कि टेबल का एक गुच्छा है जो "देशों" या "मुद्राओं" तालिकाओं से जुड़ा हुआ है।char को प्राथमिक/विदेशी कुंजी के रूप में उपयोग कर रहा है नहीं?

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

डेटाबेस innsb इंजन के साथ mysql है।

क्या यह प्रदर्शन समस्याओं का कारण बन रहा है? क्या यह कुछ है जो मुझे टालना चाहिए?

उत्तर

21

प्रदर्शन वास्तव में मुख्य मुद्दा नहीं है, कम से कम मेरे लिए नहीं। मुद्दा सरोगेट बनाम प्राकृतिक कुंजी के बारे में अधिक है।

देश कोड स्थिर नहीं हैं। वे बदल सकते हैं और कर सकते हैं। देश नाम बदलते हैं (उदाहरण के लिए इथियोपिया एरिट्रिया)। वे अस्तित्व में आते हैं (उदाहरण के लिए युगोस्लाविया या सोवियत संघ का टूटना) और वे अस्तित्व में रहे (उदाहरण के लिए पश्चिम और पूर्वी जर्मनी)। जब ऐसा होता है तो आईएसओ मानक कोड बदलता है। Name Changes Since 1990: Countries, Cities, and More

सरोगेट कुंजी में

अधिक है क्योंकि जब इन घटनाओं संदर्भ तालिका में होती हैं कुंजी में परिवर्तन नहीं करते, केवल कॉलम करना बेहतर हो जाते हैं।

इसी कारण से मैं देश और मुद्रा तालिकाओं को इसके बजाय एक प्राथमिक प्राथमिक कुंजी के साथ बनाने के इच्छुक हूं।

कहा जा रहा है कि, वर्कर प्रमुख फ़ील्ड अधिक जगह का उपयोग करेंगे और कुछ प्रदर्शन नुकसान होंगे जो शायद तब तक कोई मुद्दा नहीं होंगे जब तक आप बड़ी संख्या में प्रश्न नहीं कर रहे हों।

पूर्णता के लिए, आप Database Development Mistakes Made by AppDevelopers का संदर्भ ले सकते हैं।

+3

इथियोपिया यह का नाम बदल?!? – SeanJA

+0

फ़ोन को डरते हुए, मुझे इस सटीक उत्तर टाइप करने के बीच में उठ गया। खूब कहा है! – Eric

+0

@ सेनजा: उस लिंक के अनुसार, हाँ। यह एक अस्थायी परिवर्तन हो सकता है। – cletus

2

जेम्स स्किडमोर का लिंक पढ़ने के लिए महत्वपूर्ण है।

यदि आप अपने आप को देश और मुद्रा कोड (क्रमशः 2 और 3 वर्ण) तक सीमित कर रहे हैं, तो आप कॉलम चार (2) और चार (3) घोषित करने में बहुत सक्षम हो सकते हैं।

मुझे लगता है कि यह नो-नो नहीं होगा। यदि आप 8-बिट वर्ण एन्कोडिंग का उपयोग कर रहे हैं, तो आप स्तंभों को क्रमशः छोटे या मध्यम रंग के आकार को देख रहे हैं।

0

मेरा जवाब यह है कि कोई स्पष्ट जवाब नहीं है। बस अपनी परियोजना के भीतर एक दृष्टिकोण चुनें और सुसंगत रहें। दोनों के पास उनके प्लस और माइनस हैं।

@cletus जेनरेट की गई कुंजी का उपयोग करने के बारे में एक अच्छा बिंदु बनाता है, लेकिन जब आप ऐसी स्थिति में भाग लेते हैं जहां डेटा अपेक्षाकृत स्थिर है, जैसे देश कोड, उनके लिए जेनरेट की गई कुंजी पेश करना अत्यधिक जटिल लगता है। असली दुनिया की राजनीति के बावजूद, देश कोड होने और गायब होने के कारण वास्तव में अधिकांश व्यावसायिक समस्याओं के लिए कोई समस्या नहीं होगी (लेकिन यदि आपका डेटा सक्रिय रूप से सभी 190-210 देशों से संबंधित है, तो उस सलाह का पालन करें)।

सरोगेट कुंजी का सार्वभौमिक उपयोग करना एक अच्छी और लोकप्रिय रणनीति है। लेकिन याद रखें, यह सब कुछ के लिए प्राकृतिक कुंजी का उपयोग कर मॉडलिंग डेटाबेस के जवाब में आता है। एसीके! 15 साल पुरानी डेटाबेस बुक खोलें। हर जगह प्राकृतिक चाबियों का उपयोग करना आपको मुश्किल परिस्थितियों में ले जाता है, क्योंकि समस्या की शुरुआती समझ डोमेन गलत साबित होती है। आप अपने मॉडलिंग प्रथाओं में स्थिरता चाहते हैं, लेकिन स्पष्ट रूप से अलग स्थितियों के लिए विभिन्न तकनीकों का उपयोग करना ठीक है।

मैं वर (2) विदेशी कुंजी एक ही (या बेहतर) क्षेत्रों पूर्णांक से हो जाएगा पर सबसे आधुनिक डेटाबेस के लिए कि प्रदर्शन संदेह है। डेटाबेस वर्षों से पाठित विदेशी कुंजी समर्थित है।

यह देखते हुए कि हमारे पास प्रोजेक्ट के बारे में कोई अन्य जानकारी नहीं है, अगर आप देश कोड को विदेशी कुंजी के रूप में उपयोग करना चाहते हैं, और आपके पास ऐसा करने का विकल्प है, तो मैं कहूंगा कि यह ठीक है। डेटा के साथ काम करना आसान होगा। यह वर्तमान प्रथाओं के खिलाफ थोड़ा सा है, लेकिन - इस मामले में - यह आपको किसी कोने में वापस नहीं जा रहा है।

+0

-1 यह वास्तव में काफी गलत है। के रूप में जेम्स द्वारा http://forums.mysql.com/read.php?153,243809,243818#msg-243818 में की ओर इशारा किया, वहाँ बातें MySQL (सवाल में डेटाबेस) varchars है कि यह साथ करता है के साथ क्या नहीं करता है int कुंजी – cletus

+0

मैं सिर्फ अनुमान लगा रहा था कि चूंकि डेटाबेस साल के लिए ऐसा किया, यह अनुकूलित किया जाएगा। पहली बार यह नहीं होगा कि धारणा गलत साबित हुई! लेकिन यह पोस्ट थोड़ा अलग सवाल है ("प्राथमिक कुंजी के लिए VARCHAR (45) का अच्छा विकल्प उपयोग कर रहा है?") यह समस्या 200 पंक्ति तालिका (देशों की संख्या) पर CHAR (2) है। दुर्भाग्य से उस पोस्ट सामान्य रूप में FK सूचकांक प्रदर्शन चर्चा नहीं करता है, और चाहे CHAR (2) (2), और मैं इसे खुदाई अप नहीं कर सकता VARCHAR तुलना में अधिक कुशल होने जा रहा है। लिंक के लिए धन्यवाद। – ndp

+0

मैं सहमत हूं, यह चर्चा करता है कि 45 बाइट चार कितना बुरा है क्योंकि यह 4-5 गुना बड़ा सामान्य int है, लेकिन चार (2) या चार (3) के साथ वहां बहुत अंतर नहीं होता है। –

संबंधित मुद्दे