समस्या
हम PostgreSQL के शीर्ष पर जावा में एक वेब अनुप्रयोग का निर्माण कर रहे में आईडी से बाहर चलाने के लिए जा रहा। यह काफी बड़ा और सफल है, और यह कम से कम कुछ और वर्षों तक चलाने में सक्षम होना चाहिए।PostgreSQL: पूर्णांक कॉलम
दुर्भाग्यवश, हमने (अच्छी तरह से, मैंने) डिजाइन प्रक्रिया के शुरुआती चरणों में गंभीर गलती की: सभी डेटाबेस आईडी एक साझा अनुक्रम से दिए गए पूर्णांक हैं।
Java's max int is 2^31-1, तो लगभग 2 अरब। यह PostgreSQL's integer type के लिए जाता है। प्रणाली वर्तमान में ~ 10k आईडी प्रतिदिन खा रही है, और दर बढ़ रही है क्योंकि हम नए उपयोगकर्ताओं को प्राप्त करते हैं।
एक दिन, आईडी समाप्त हो जाएगी और ओवरफ़्लो होगा।
प्रश्न
हम स्थिति को ठीक करने के तरीकों की तलाश में हैं। आइए तुरंत स्पष्ट तरीके से बाहर निकलें: जावा के long
पर स्विचिंग और पोस्टग्रेस 'bigint
एक साफ समाधान है, लेकिन यह टन काम का है। हमें इसे यथासंभव स्थगित करने की आवश्यकता है।
कुछ विचार हम अब तक मिला है:
- , सब कुछ के लिए एक अनुक्रम का प्रयोग न करें प्रत्येक तालिका का अपना अनुक्रम दे।
- पेशेवर: यह हमें एन गुना अधिक समय देता है, जहां एन टेबल की संख्या है।
- विपक्ष: हमें इस तथ्य को पसंद है कि प्रत्येक पंक्ति में एक अद्वितीय आईडी है।
- कुछ तालिकाओं के लिए अनुक्रम आईडी का उपयोग करना बंद करें। उदाहरण के लिए, ग्राहक घटनाओं वाली एक तालिका को वास्तव में एक आईडी की आवश्यकता नहीं होती है:
customer, timestamp
एक पूरी तरह से मान्य प्राथमिक कुंजी है।- पेशेवर: हमारे कुछ सबसे बड़े आईडी-हॉग इस तरह से बदला जा सकता है।
- विपक्ष: काम की अनौपचारिक राशि।
- खाली रिकॉर्ड्स पर आईडी बर्बाद करना बंद करें। यह कुछ उप-तालिकाओं के साथ होता है, जैसे ग्राहक संपर्क जानकारी। रिकॉर्ड हमेशा मौजूद होने से कोड को सरल बना दिया जाता है, लेकिन इसका मतलब है कि कई ग्राहकों के पास एक खाली संपर्क जानकारी रिकॉर्ड संग्रहीत होता है।
- पेशेवर: हमारे कुछ सबसे बड़े आईडी-हॉग इस तरह से तय किए जा सकते हैं।
- विपक्ष: हम कोड सादगी खो देते हैं।
- प्रत्येक नई तालिका को
long
/bigint
का उपयोग एक नए अनुक्रम के साथ करना चाहिए।- पेशेवर: कम से कम हम इसे और खराब नहीं करते हैं।
- विपक्ष: शेष कोड के साथ संपर्क सतह बदसूरत होगी।
इन बाधाओं के तहत, क्या अन्य तरीकों आईडी कमी विलंब होगा?
हाँ इस दर्द है। केवल दो दृष्टिकोण, 1) बिगिन के साथ जाएं और रिफैक्टर (या) 2) सब कुछ के लिए अनुक्रम का उपयोग न करें। मैं refactoring की ओर अधिक दुबला (अन्य दृष्टिकोण, किसी बिंदु पर आप संख्या समाप्त हो जाएगा)। केवल विकल्प दो का चयन करेंगे, जहां हम जानते हैं कि यह एप्लिकेशन संख्या निकास से पहले बंद हो जाएगा। – kosa
"यह काम का एक टन है। हमें इसे यथासंभव स्थगित करने की आवश्यकता है।" यदि आप इसे स्थगित करते हैं तो यह दो टन होगा। गोली मारो और अब करो। –
मुझे यह कहने से नफरत है, लेकिन जैसा कि आप राय और विकल्पों के लिए पूछ रहे हैं, आप शायद बंद होने जा रहे हैं। मैं ऐसा करने वाला नहीं हूं, लेकिन कोई होगा। –