2008-11-27 13 views
10

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

STATUS (max 6) 
AC --> Active 
DE --> Deleted 

COUNTRIES (total 30) 
UK --> United Kingdom 
IT --> Italy 
GR --> Greece 

इन तालिकाओं स्थिर, आवेदन के माध्यम से अपडेट नहीं हैं और यह इतना है कि भविष्य में परिवर्तन होने की अनुमान नहीं कर रहा है टेबल में अद्यतन समस्याओं का कोई मौका नहीं है जो इन मानों को विदेशी कुंजी के रूप में उपयोग करेगा।

आवेदन की स्थिति और देश (एक बार से अधिक जैसे मूल देश, गंतव्य देश) का उपयोग करेगा की मुख्य तालिका और यह अनुमान है कि 600000 पंक्तियों प्रति वर्ष जोड़ दिया जाएगा

तो मेरे सवाल है, होगा इन VARCHAR (2) 3 टेबल में शामिल होने पर पूछताछ करते समय कुंजी में प्रदर्शन का असर होगा। क्या पहले दूसरे की तुलना में काफी धीमी होगी?

SELECT m.*, 
     s.status_name, 
     c.country_name 
    FROM main m, status s, countries c 
WHERE m.status_cd = s.status_cd 
    AND m.country_cd = c.country_cd 
    AND m.status_cd = 'AC' 
    AND m.country_cd = 'UK' 

SELECT m.*, 
     s.status_name, 
     c.country_name 
    FROM main m, status s, countries c 
WHERE m.status_cd = s.status_cd 
    AND m.country_cd = c.country_cd 
    AND m.status_cd = 1 
    AND m.country_cd = 2 

स्पष्टीकरण:

स्थिति बाइनरी ("अधिकतम 6" तालिका नाम के आगे) नहीं है। मान शायद होंगे:

* active 
* deleted 
* draft 
* send 
* replaced 

और हमें उपयोगकर्ता को डीकोडेड मान प्रदर्शित करने की आवश्यकता है, इसलिए हमें नामों की आवश्यकता है।

+1

क्या आप ओरेकल में VARCHAR2 या VARCHAR (2) का उपयोग कर रहे हैं? यदि ओरेकल VARCHAR2 का उपयोग कर रहे हैं, तो कोष्ठक भ्रामक हैं। यदि वचर (2), तो क्यों नहीं (2) जो आमतौर पर अधिक कुशल है। –

उत्तर

0

यदि 'स्थिति' एक बाइनरी सक्रिय/हटाया गया फ़ील्ड है, तो तालिका के साथ परेशान क्यों है (और हमेशा रहेगा?)। ऐसा लगता है कि एक अव्यवहारिक चरम पर सामान्यीकरण किया जाता है।

यह होगा निश्चित रूप से तेज़ी से किया जा, नहीं आसान उल्लेख करने के लिए, बस एक tinyint (1) क्षेत्र का उपयोग करें और एक 1 या 0.

यह आपके पूरी तरह से जुड़ जाता है में से एक को समाप्त के रूप में सक्रिय/नष्ट कर दिया राज्य रिकॉर्ड करने के लिए जो एक अच्छी बात होनी चाहिए।

+0

चूंकि सवाल कहता है कि 6 स्टेटस कोड हैं, यह बाइनरी फ़ील्ड नहीं है। –

2

यह link देखें। नीचे की रेखा वर्चर और num के बीच बहुत अधिक प्रदर्शन अंतर नहीं है। इसलिए आपको कॉलम के लिए कभी भी समझदारी होनी चाहिए। यहां, वर्कर अधिक समझ में आता है।

0

इससे कोई फर्क नहीं पड़ता कि आप इस मामले में कौन सी मेथोड चुनते हैं। महत्वपूर्ण हिस्सा डेटाबेस में एक ही तरह का उपयोग करना और आपके आईडी सम्मेलन में सुसंगत होना है।

5

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

विभिन्न प्रकार के साथ जुड़ने के बीच प्रदर्शन अंतर नगण्य होने जा रहा है, और संख्यात्मक कोड धीमा हो जाएगा, क्योंकि 'अधिक' डेटा स्टोर करने के लिए धीमा हो जाएगा (लेकिन यह इतना छोटा है कि यह नगण्य है, फिर)।

तो, प्राकृतिक कोड के साथ जाएं। बाकी सब कुछ, एसक्यूएल पहले उदाहरण में स्पष्ट है; 'यूके' और 'एसी' 1 और 2 से अधिक अर्थपूर्ण हैं।

गैर-ओरेकल डीबीएमएस में, आप शायद स्थिति और देश कोड मान दोनों के लिए CHAR (2) का उपयोग करेंगे।ओरेकल उपयोगकर्ता सब कुछ के लिए VARCHAR2 का उपयोग करते हैं; मुझे यकीन नहीं है कि इसके बजाय एक CHAR (2) कॉलम का उपयोग करने के लिए जुर्माना है, खासकर जब कॉलम मान निश्चित हैं। (उदाहरण के लिए, इन्फॉर्मिक्स के तहत, एक VARCHAR (2) फ़ील्ड - दो वर्णों का एक फ़ील्ड - 3 बाइट्स, एक लम्बाई (हमेशा आपके मामले में 2) और 2 डेटा बाइट्स के रूप में स्टोर करेगा। इसके विपरीत, एक CHAR (2) क्षेत्र केवल 2 बाइट्स पर कब्जा करेगा।)

+2

ओरेकल में, एक चार्ज और एक वर्चर फ़ील्ड डिस्क पर बिल्कुल समान रूप से संग्रहीत किया जाता है - सिवाय इसके कि एक CHAR फ़ील्ड को इसकी निर्दिष्ट लंबाई में स्पेस-पैड किया जाना चाहिए। – Dracorat

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