क्या मुझे PostgreSQL बिट स्ट्रिंग का उपयोग करना चाहिए?


18

मैं bit stringहाल ही में डेटा प्रकार के बारे में सीख रहा हूं, और मैं इसके बारे में काफी उत्सुक हूं:

  1. इस डॉक्टर पृष्ठ के नीचे वाक्य है:

    ... प्लस 5 या 8 बाइट्स ओवरहेड स्ट्रिंग की लंबाई पर निर्भर करता है

  2. अन्य भाषाओं जैसे PHP, Java, C #, C ++ इत्यादि में Npgsql, ODBC, आदि जैसे ड्राइवरों के माध्यम से बिट स्ट्रिंग्स को कैसे संभाला जाता है।

प्रश्न # 1 के लिए, स्मॉलिंट या बिगिन्ट का उपयोग करना बहुत अधिक भंडारण कुशल होगा, और शायद पूर्णांक समर्थन के बाद से हर जगह प्रदर्शन का लाभ मिलेगा। अधिकांश प्रोग्रामिंग भाषाएं आसानी से पूर्णांकों पर बिट संचालन को संभालती हैं। यदि ऐसा है, तो बिट-स्ट्रिंग डेटा प्रकार को शुरू करने का क्या मतलब है? क्या यह केवल उन मामलों के लिए है जिन्हें बड़ी मात्रा में बिट मास्क की आवश्यकता है? बिट क्षेत्र अनुक्रमण शायद? PostgreSQL में बिट क्षेत्र अनुक्रमण कैसे किया जाता है, इसके बारे में मैं अधिक उत्सुक हूं।

# 2 के लिए, मैं भ्रमित हूं, जिज्ञासु से अधिक। उदाहरण के लिए, क्या होगा यदि मैं सप्ताह के दिन के मुखौटे को एक बिट (7) फ़ील्ड में संग्रहीत करता हूं, एक दिन के लिए एक बिट, सोमवार को सबसे कम बिट का प्रतिनिधित्व करता है। फिर मैंने पीएचपी और सी ++ में मूल्य के लिए क्वेरी की। मुझे क्या मिलेगा? प्रलेखन कहता है कि मेरे पास थोड़ा सा स्ट्रिंग होगा, हालांकि थोड़ा स्ट्रिंग कुछ ऐसा नहीं है जिसका मैं सीधे उपयोग कर सकता हूं - जैसे कि पूर्णांक। फिर इस मामले में, क्या मुझे थोड़ा क्षेत्र छोड़ देना चाहिए?

क्या कोई इस बात को विस्तृत कर सकता है कि मुझे कब और क्यों अलग-अलग बिट या बिट का उपयोग करना चाहिए?



2
एसओ पर इरविन का जवाब बहुत अच्छा है (और अगर आपको @Erwin पर इसे कॉपी करने में कोई आपत्ति नहीं है, तो यह आपके लिए उपयोगी होगा), लेकिन मैं अपनी खुद की सावधानी जोड़ना चाहूंगा: ज्यादातर मामलों में आप जानकारी संग्रहीत करने पर विचार नहीं करेंगे। RDBMS पर बिट स्ट्रिंग्स में - स्टोरेज दक्षता की परवाह किए बिना सामान्य समाधान में अलग बूलियन कॉलम का उपयोग करना।
जैक कहते हैं कि topanswers.xyz

@JackDouglas: मुझे अपने उत्तर की नकल करने में कोई दिक्कत नहीं होगी। मुझे आश्चर्य है, हालांकि: एसई साइटों में एक उत्तर को दोहरा रहा है एक अच्छा विचार है?
एरविन ब्रान्डस्टेट्टर

@ इरविन मैं नहीं देखता कि क्यों नहीं - साइटों के बीच कुछ ओवरलैप है और वे दोनों अकेले खड़े होने वाले हैं (इसलिए उदाहरण के लिए हम नहीं करेंगे - और वैसे भी नहीं कर सकते थे - यहाँ एक प्रश्न को एक डुप्लिकेट के रूप में बंद करें अगर वहाँ था एसओ पर एक समान प्रश्न)। हमारा ध्यान 'विशेषज्ञ' मुद्दों पर अधिक है, लेकिन IMO आपका जवाब उस श्रेणी के अनुसार फिट बैठता है :)
जैक कहते हैं कि topanswers.xyz का प्रयास करें

@JackDouglas: ठीक है, समझ में आता है। और जिस तरह से आप फिसल गए, उसके बाद मैं संभवतः कैसे असहमत हो सकता था? ;)
एरविन ब्रान्डसेट्टर

जवाबों:


18

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

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

भंडारण का अनुकूलन

यदि आपके पास एक हाथ से अधिक चर हैं, लेकिन 33 से कम है, तो एक integerकॉलम आपको सबसे अच्छी सेवा दे सकता है । (या bigint64 चर तक के लिए)

  • डिस्क पर 4 बाइट्स रखता है।
  • सटीक मैचों ( =ऑपरेटर) के लिए बहुत तेज़ अनुक्रमण ।
  • अलग-अलग मूल्यों को संभालना धीमा / कम सुविधाजनक हो सकता है bit stringया इसके साथ boolean

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

उदाहरण

जानकारी के सिर्फ 3 बिट्स के लिए, व्यक्तिगत booleanकॉलम 3 बाइट्स, integer4 बाइट्स और bit string6 बाइट्स (5 + 1) की आवश्यकता होती है।

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

आगे की पढाई


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

3

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

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

जब आप बिटवाइज़ ऑपरेशंस के आधार पर रिकॉर्ड्स का चयन करना चाहते हैं, तो यह उपयोगी है, जैसे कि बिटवाइज़ या बिटवाइज़ और, या SQL क्वेरीज़ में डेटा को हेरफेर करना। जब तक आप ऐसा नहीं कर रहे हैं, PostgreSQL की अधिक गूढ़ विशेषताओं में से कई कम सहायक हैं।

बाइनरी जानकारी के लंबे तार के लिए भी ध्यान दें एक बड़ा ऑब्जेक्ट इंटरफ़ेस है जो आपको स्ट्रीमिंग आदि करने की अनुमति देता है और एक बाइट इंटरफ़ेस जो एक अधिक कॉम्पैक्ट स्ट्रिंग प्रतिनिधित्व की अनुमति देता है।

tl; डॉ: यदि आपको इसकी आवश्यकता है तो आप इसे जान जाएंगे। अन्यथा इसे अपने दिमाग के "भविष्य के उपयोग के लिए आरक्षित" खंड में दर्ज करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.