PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

postgresql बिना अंतराल के अनुक्रम उत्पन्न करता है

अनुक्रम संख्याओं के अंतर-मुक्त सेट उत्पन्न नहीं करते हैं, और वास्तव में उन्हें ऐसा करने का कोई तरीका नहीं है क्योंकि रोलबैक या त्रुटि अनुक्रम संख्या का "उपयोग" करेगी।

मैंने कुछ समय पहले इस पर एक लेख लिखा था। यह Oracle पर निर्देशित है लेकिन वास्तव में गैप-फ्री नंबरों के मूलभूत सिद्धांतों के बारे में है, और मुझे लगता है कि यह यहाँ भी लागू होता है।

खैर, यह फिर से हुआ है। किसी ने पूछा है कि संख्याओं की एक अंतराल-मुक्त श्रृंखला उत्पन्न करने के लिए एक आवश्यकता को कैसे कार्यान्वित किया जाए और कहने वालों का एक झुंड उन पर उतर आया है (और यहां मैं थोड़ा सा व्याख्या करता हूं) कि यह सिस्टम प्रदर्शन को मार देगा, यह शायद ही कभी एक वैध आवश्यकता है , कि जिसने भी आवश्यकता लिखी है वह एक बेवकूफ ब्ला ब्ला ब्ला है।

जैसा कि मैं धागे पर इंगित करता हूं, कभी-कभी संख्याओं की अंतर-मुक्त श्रृंखला उत्पन्न करना एक वास्तविक कानूनी आवश्यकता होती है। यूके में 2,000,000+ संगठनों के लिए चालान संख्या जो पंजीकृत वैट (बिक्री कर) हैं, उनकी ऐसी आवश्यकता है, और इसका कारण स्पष्ट है:इससे कर अधिकारियों से राजस्व की पीढ़ी को छिपाना अधिक कठिन हो जाता है। मैंने टिप्पणियां देखी हैं कि यह स्पेन और पुर्तगाल में एक आवश्यकता है, और मुझे आश्चर्य नहीं होगा यदि कई अन्य देशों में इसकी आवश्यकता नहीं थी।

इसलिए, यदि हम स्वीकार करते हैं कि यह एक वैध आवश्यकता है, तो किन परिस्थितियों में संख्याओं की रिक्त श्रृंखला* एक समस्या है? समूह-विचार अक्सर आपको विश्वास दिलाएगा कि यह हमेशा होता है, लेकिन वास्तव में यह बहुत ही विशेष परिस्थितियों में एक संभावित समस्या है।

  1. संख्याओं की श्रृंखला में कोई अंतराल नहीं होना चाहिए।
  2. कई प्रक्रियाएं वे निकाय बनाती हैं जिनसे नंबर संबद्ध है (उदा. चालान)।
  3. संख्याएं उस समय उत्पन्न होनी चाहिए जब इकाई बनाई जाती है।

अगर इन सभी आवश्यकताओं को पूरा किया जाना चाहिए तो आपके आवेदन में क्रमांकन का एक बिंदु है, और हम उस पर एक पल में चर्चा करेंगे।

यदि आप इनमें से किसी एक आवश्यकता को छोड़ सकते हैं, तो सबसे पहले संख्याओं की श्रृंखला आवश्यकता को लागू करने के तरीकों के बारे में बात करते हैं।

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

यदि आपके पास इकाइयाँ बनाने वाली कई प्रक्रियाएँ नहीं हैं (और आपको संख्याओं की एक अंतराल-मुक्त श्रृंखला की आवश्यकता है जो तुरंत उत्पन्न होनी चाहिए), जैसा कि चालान के बैच निर्माण के मामले में हो सकता है, तो आपके पास पहले से ही क्रमांकन का एक बिंदु है। यह अपने आप में कोई समस्या नहीं हो सकती है, और आवश्यक संचालन करने का एक कुशल तरीका हो सकता है। इस मामले में गैप-फ्री नंबर जेनरेट करना मामूली है। आप वर्तमान अधिकतम मूल्य को पढ़ सकते हैं और कई तकनीकों के साथ प्रत्येक इकाई के लिए एक वृद्धिशील मूल्य लागू कर सकते हैं। उदाहरण के लिए यदि आप एक अस्थायी कार्य तालिका से चालानों का एक नया बैच अपनी चालान तालिका में सम्मिलित कर रहे हैं तो आप:

insert into
  invoices
    (
    invoice#,
    ...)
with curr as (
  select Coalesce(Max(invoice#)) max_invoice#
  from   invoices)
select
  curr.max_invoice#+rownum,
  ...
from
  tmp_invoice
  ...

बेशक आप अपनी प्रक्रिया की रक्षा करेंगे ताकि एक समय में केवल एक उदाहरण चल सके (शायद डीबीएमएस_लॉक के साथ यदि आप ओरेकल का उपयोग कर रहे हैं), और एक अद्वितीय कुंजी बाधा के साथ चालान # की रक्षा करें, और शायद अलग कोड के साथ लापता मानों की जांच करें यदि आप वास्तव में, वास्तव में परवाह करते हैं।

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

तो अगर हमें कई प्रक्रियाओं द्वारा संख्याओं की अंतराल मुक्त श्रृंखला की तत्काल पीढ़ी के ट्राइफेक्टा की आवश्यकता है? हम बस इतना कर सकते हैं कि प्रक्रिया में क्रमांकन की अवधि को कम करने का प्रयास करें, और मैं निम्नलिखित सलाह देता हूं, और किसी भी अतिरिक्त सलाह (या निश्चित रूप से प्रति-सलाह) का स्वागत करता हूं।

  1. अपने वर्तमान मूल्यों को एक समर्पित तालिका में संग्रहित करें। अनुक्रम का उपयोग न करें।
  2. सुनिश्चित करें कि सभी प्रक्रियाएं एक ही कोड का उपयोग किसी फ़ंक्शन या प्रक्रिया में इनकैप्सुलेट करके नए नंबर उत्पन्न करने के लिए करती हैं।
  3. डीबीएमएस_लॉक के साथ नंबर जेनरेटर तक पहुंच को सीरियलाइज करें, यह सुनिश्चित करते हुए कि प्रत्येक श्रृंखला का अपना एक समर्पित लॉक है।
  4. श्रृंखला जनरेटर में लॉक को तब तक दबाए रखें जब तक कि आपकी इकाई निर्माण लेन-देन पूरा नहीं हो जाता है, लॉक ऑन कमिट जारी कर देता है
  5. संख्या के निर्माण को अंतिम संभावित क्षण तक विलंबित करें।
  6. संख्या उत्पन्न करने के बाद और कमिट पूरा होने से पहले एक अप्रत्याशित त्रुटि के प्रभाव पर विचार करें - क्या एप्लिकेशन इनायत से रोलबैक करेगा और लॉक को छोड़ देगा, या यह सीरीज़ जनरेटर पर लॉक तब तक रखेगा जब तक कि सत्र बाद में डिस्कनेक्ट न हो जाए? जो भी तरीका इस्तेमाल किया जाता है, अगर लेन-देन विफल हो जाता है, तो श्रृंखला संख्या (संख्याओं) को "पूल में वापस कर दिया जाना चाहिए"।
  7. क्या आप इकाई की मेज पर एक ट्रिगर में पूरी चीज़ को समाहित कर सकते हैं? क्या आप इसे किसी तालिका या अन्य एपीआई कॉल में इनकैप्सुलेट कर सकते हैं जो पंक्ति को सम्मिलित करता है और स्वचालित रूप से सम्मिलित करता है?

मूल लेख



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. org.postgresql.util.PSQLException:ऑटो-प्रतिबद्ध मोड में बड़ी वस्तुओं का उपयोग नहीं किया जा सकता है

  2. त्रुटि कैसे ठीक करें:कॉलम c.relhasoids Postgres में मौजूद नहीं है?

  3. हाइबरनेट को अगला अनुक्रम मान नहीं मिल सका

  4. SQL में अस्थायी तालिकाएँ बनाना

  5. बहु-पंक्ति क्वेरी के लिए psql की \ copy का उपयोग करें