2012-04-03 21 views
13

मैं एक पोस्टग्रेएसक्यूएल डेटाबेस में एक टेबल के साथ काम कर रहा हूं जिसमें कई बूलियन कॉलम हैं जो कुछ राज्य निर्धारित करते हैं (उदा। published, visible, आदि)। मैं एक एकल स्टेटस कॉलम बनाना चाहता हूं जो इन सभी मानों को साथ ही साथ संभवतः नए बिट्स को बिटमैस्क के रूप में स्टोर करेगा। इस मामले में integer और bit(n) के बीच कोई अंतर है?क्या बिटकमास्क के लिए पूर्णांक और बिट (एन) डेटा प्रकारों के बीच कोई अंतर है?

यह एक बड़ी तालिका होने जा रहा है, क्योंकि यह उन वस्तुओं को संग्रहीत करता है जो उपयोगकर्ता वेब-इंटरफ़ेस के माध्यम से बनाते हैं। तो मुझे लगता है कि मुझे इस कॉलम के लिए (आंशिक) इंडेक्स का उपयोग करना होगा।

उत्तर

21

यदि आपके पास केवल कुछ चर है तो मैं boolean कॉलम अलग रखने पर विचार करता हूं।

  • इंडेक्सिंग आसान है। विशेष रूप से indexes on expressions और partial indexes भी।
  • प्रश्नों के लिए शर्तें लिखना और पढ़ना और सार्थक होना आसान है।
  • एक बुलियन कॉलम 1 बाइट (कोई संरेखण पैडिंग) पर कब्जा नहीं करता है। केवल कुछ चर के लिए यह कम से कम स्थान पर है।
  • अन्य विकल्पों के विपरीत boolean कॉलम NULL व्यक्तिगत बिट्स के लिए मूल्यों की आवश्यकता होने पर आपको इसकी आवश्यकता होनी चाहिए। यदि आप नहीं करते हैं तो आप कॉलम NOT NULL को हमेशा परिभाषित कर सकते हैं।

आप एक हाथ की तुलना में अधिक पूर्ण चर लेकिन है, तो कोई 32 से अधिक, एक integer स्तंभ सबसे अच्छा सेवा कर सकता है। (या 64 चर भी के लिए एक bigint।)

  • डिस्क पर 4 बाइट (पूर्ववर्ती स्तंभों के आधार पर, संरेखण गद्दी आवश्यकता हो सकती है) में रह रहे हैं।
  • सटीक मिलान के लिए बहुत तेजी से अनुक्रमण (= ऑपरेटर)।
  • व्यक्तिगत मानों को संभालना varbit या boolean के मुकाबले धीमा/कम सुविधाजनक हो सकता है।

और भी चर के साथ, या यदि आप मानों को बहुत अधिक कुशल बनाना चाहते हैं, या यदि आपके पास बड़ी टेबल या डिस्क स्पेस/रैम नहीं है, तो कोई समस्या नहीं है, या यदि आप सुनिश्चित नहीं हैं कि क्या चुनना है , मैं bit(n) or bit varying(n) (short: varbit(n) पर विचार करता हूं।

  • 8 बिट्स (गोलाकार) के प्रत्येक समूह के लिए कम से कम 5 बाइट्स (या बहुत लंबे तारों के लिए 8) प्लस 1 बाइट पर कब्जा करता है।
  • आप सीधे bit string functions and operators का उपयोग कर सकते हैं, और some standard SQL functions as well

सिर्फ 3 बिट्स जानकारी के के लिए, अलग-अलग boolean कॉलम 3 बाइट्स, एक integer जरूरतों 4 बाइट (शायद अतिरिक्त संरेखण गद्दी) और एक bit string 6 बाइट्स (5 + 1) के साथ से मिलता है।

32 बिट्स जानकारी के के लिए, एक integer अभी भी 4 बाइट (+ गद्दी) की जरूरत है, एक bit string ही (5 + 4) के लिए 9 बाइट्स पर है और boolean कॉलम 32 बाइट्स पर कब्जा।

डिस्क स्पेस अनुकूलित करने के लिए आपको पोस्टग्रेएसक्यूएल, विशेष रूप से डेटा संरेखण के संग्रहण तंत्र को समझने की आवश्यकता है। More in this related answer

कैसे प्रकारबूलियन, बिट (एन) और पूर्णांक, मदद की हो सकती है भी बदलने पर This answer

+0

स्पष्टीकरण के लिए बहुत बहुत धन्यवाद, यही वही है जो मुझे चाहिए! मुझे लगता है कि मैं एक 'पूर्णांक' कॉलम के साथ जाऊंगा। –

0

आप bit string functions सीधे एक पूर्णांक से डालने की आवश्यकता के बिना थोड़ा स्ट्रिंग पर लागू कर सकते हैं।