प्रॉम्प्ट और दायरा
मूल्य, लीज, शेड्यूल और अनुमति रिकॉर्ड एक बिज़नेस कुंजी को वैधता अवधि के साथ जोड़ते हैं। साक्षात्कारकर्ता चाहता है कि डेटाबेस एक ही उत्पाद या टेनेंट के लिए ओवरलैपिंग अवधियों को अस्वीकार करे, जिसमें समवर्ती राइट्स भी शामिल हैं। यह प्रश्न केवल टकराव ढूंढने वाली क्वेरी के बजाय टेम्पोरल मॉडलिंग, कंस्ट्रेंट सेमेंटिक्स और एक सुरक्षित माइग्रेशन योजना का परीक्षण करता है।
साक्षात्कारकर्ता क्या मूल्यांकन करता है
- क्या आप
WITHOUT OVERLAPSटेम्पोरल प्राइमरी या यूनिक की और एक सामान्य B-tree यूनिक की के बीच अंतर करते हैं। - क्या आप रेंज एंडपॉइंट्स, खाली रेंज, NULL व्यवहार, असतत तिथियां और निरंतर टाइमस्टैम्प को परिभाषित करते हैं।
- क्या आप समझते हैं कि एक
PERIODफॉरेन की केवल एक मेल खाने वाली बिज़नेस कुंजी ही नहीं, बल्कि समय कवरेज की भी जांच करती है। - क्या आप ऐतिहासिक क्लीनअप, लॉक प्रभाव, रोलबैक और समवर्ती सत्यापन की योजना बना सकते हैं।
- क्या डेटाबेस कंस्ट्रेंट्स, एप्लिकेशन संदेशों और ऑडिट मेट्रिक्स की अलग-अलग ज़िम्मेदारियाँ हैं।
सेमेंटिक्स और सीमाएं
PostgreSQL रेंज कॉलम पर टेम्पोरल कंस्ट्रेंट्स को परिभाषित करता है। WITHOUT OVERLAPS का उपयोग प्राइमरी-की और यूनिक कंस्ट्रेंट्स में किया जा सकता है; समान सामान्य कुंजी भागों के लिए, संबद्ध रेंज ओवरलैप नहीं होनी चाहिए। रेंज कॉलम अंतर्निहित रूप से नॉन-नल होता है, और खाली रेंज या मल्टीरेंज वैध टेम्पोरल कीज़ नहीं बनाते हैं। इस डेटाबेस इनवेरिएंट को एप्लिकेशन के "जांचें, फिर इन्सर्ट करें" के क्रम से प्रतिस्थापित नहीं किया जा सकता है।
PERIOD का उपयोग टेम्पोरल फॉरेन कीज़ के लिए किया जाता है। एक चाइल्ड बिज़नेस कुंजी और अवधि को एक या अधिक पैरेंट पंक्तियों द्वारा कवर किया जाना चाहिए; यह साबित करना अपर्याप्त है कि समान बिज़नेस कुंजी वाली एक पैरेंट पंक्ति मौजूद है। पैरेंट को हटाना या कवर की गई अवधि को छोटा करना फॉरेन-की क्रिया और ट्रांजेक्शन ऑर्डरिंग का पालन करना चाहिए।
मॉडलिंग चरण
हाफ-ओपन या क्लोज्ड इंटरवल्स चुनें और प्रत्येक राइट पाथ पर समान कन्वेंशन का उपयोग करें। तिथि वैधता आमतौर पर [start, end) का उपयोग करती है; टाइमस्टैम्प वैधता में टाइमज़ोन और परिशुद्धता निर्दिष्ट होनी चाहिए। आवश्यकतानुसार daterange, tsrange, या tstzrange चुनते हुए, सामान्य बिज़नेस-की कॉलम को रेंज कॉलम से पहले रखें।
पैरेंट रिकॉर्ड्स पर टेम्पोरल यूनिक कंस्ट्रेंट और कवर्ड रिकॉर्ड्स पर PERIOD फॉरेन की बनाएं। एप्लिकेशन एक स्पष्ट संदेश प्रदान कर सकता है, लेकिन डेटाबेस तय करता है कि कमिट सफल होता है या नहीं। ऐतिहासिक डेटा को माइग्रेट करने से पहले, ओवरलैप्स की पहचान करने के लिए एक रिपोर्ट या एक्सक्लूजन-शैली की जांच का उपयोग करें, फिर परिभाषित करें कि प्रत्येक टकराव को मर्ज, स्प्लिट या रिटायर किया जाना है।
SQL उदाहरण
यह उदाहरण एक plan_id के लिए ओवरलैपिंग कीमतों को रोकता है और नियमों को मूल्य योजना द्वारा पूरी तरह से कवर करने की आवश्यकता रखता है:
CREATE TABLE price_plan (
plan_id bigint,
valid_during daterange NOT NULL,
amount numeric(12, 2) NOT NULL,
PRIMARY KEY (plan_id, valid_during WITHOUT OVERLAPS)
);
CREATE TABLE plan_rule (
plan_id bigint,
valid_during daterange NOT NULL,
rule_code text NOT NULL,
CONSTRAINT plan_rule_plan_period_fk
FOREIGN KEY (plan_id, PERIOD valid_during)
REFERENCES price_plan (plan_id, PERIOD valid_during)
);प्रोडक्शन से पहले एक शैडो टेबल में सिंटैक्स और व्यवहार को सत्यापित करें, और पुष्टि करें कि क्लाइंट ड्राइवर डेटाबेस टकराव को एक स्थिर तरीके से सामने लाता है। यह उदाहरण मुख्य इनवेरिएंट को दर्शाता है; मुद्रा, राशि की परिशुद्धता और ऑडिट कॉलम अभी भी उत्पाद आवश्यकताओं का पालन करते हैं।
समवर्ती राइट्स और माइग्रेशन
कंस्ट्रेंट जोड़ने से पहले, टकराव वाली सीमाओं की गणना करें और उन्हें बिज़नेस कुंजी द्वारा क्रमबद्ध करें; बिना किसी व्यावसायिक निर्णय के "डुप्लिकेट जैसी दिखने वाली" ऐतिहासिक पंक्ति को न हटाएं। एक बड़ी तालिका के लिए, इंडेक्स-निर्माण समय, लॉक प्रतीक्षा और प्रतिकृति अंतराल का अनुमान लगाएं। बैच किए गए क्लीनअप, कम-ट्रैफ़िक विंडो और प्रगति मार्करों का उपयोग करें जिन्हें देखा जा सके।
ओवरलैपिंग अवधियों के लिए दो समवर्ती इन्सर्ट को कमिट के समय डेटाबेस द्वारा समन्वित किया जाना चाहिए। एप्लिकेशन को विशिष्टता टकराव को एक पुन: प्रयास करने योग्य या समझाने योग्य व्यावसायिक त्रुटि में बदलना चाहिए; एक सफल पूर्व-जांच बाद के इन्सर्ट की गारंटी नहीं देती है। शैडो सत्यापन, दोहरे-राइट समाधान और पुनर्प्राप्ति अभ्यास पास होने तक रोलबैक के लिए पुराने कॉलम और राइट पाथ को बनाए रखें।
सामान्य गलतियाँ
- केवल एक यूनिक
(plan_id, start_at)इंडेक्स बनाना, जो अभी भी ओवरलैपिंग अवधियों की अनुमति देता है। - एंडपॉइंट नियमों को परिभाषित करने में विफल होना और
2026-02-01पर समाप्त होने वाली तारीख को अगली अवधि की शुरुआत के साथ मिलाना। - एक
PERIODफॉरेन की को एक सामान्य फॉरेन की के रूप में मानना जो केवल बिज़नेस कुंजी की जांच करती है। - इतिहास, लॉक या प्रतिकृति अंतराल की जांच किए बिना सीधे एक बड़ी प्रोडक्शन तालिका में कंस्ट्रेंट जोड़ना।
- एप्लिकेशन के पुन: प्रयासों को कंस्ट्रेंट टकरावों को छिपाने देना और डुप्लिकेट कीमतों या आंशिक कवरेज का निर्माण करना।
अनुवर्ती प्रश्न
आप मौजूदा ओवरलैप्स को कैसे संभालते हैं?
बिज़नेस कुंजी द्वारा समूहीकृत और रेंज द्वारा क्रमबद्ध एक टकराव रिपोर्ट उत्पन्न करें। बिज़नेस ओनर से मर्ज, स्प्लिट या रिटायर सेमेंटिक्स चुनने के लिए कहें; पंक्तियों की मरम्मत करें, एक शैडो टेबल में राइट्स को फिर से चलाएं, साबित करें कि रिपोर्ट खाली है, और उसके बाद ही कंस्ट्रेंट जोड़ें।
एक्सक्लूजन कंस्ट्रेंट या ट्रिगर का उपयोग क्यों नहीं करते?
एक एक्सक्लूजन कंस्ट्रेंट अंतराल के पारस्परिक अपवर्जन को व्यक्त कर सकता है, लेकिन WITHOUT OVERLAPS सीधे टेम्पोरल प्राइमरी या यूनिक सेमेंटिक्स को बताता है और PERIOD फॉरेन कीज़ के साथ जुड़ता है। ट्रिगर्स समवर्तीता, रिकर्शन या प्रतिकृति पाथ को छोड़ सकते हैं; मुख्य इनवेरिएंट को कंस्ट्रेंट्स में रखते हुए केवल अतिरिक्त क्रॉस-टेबल साइड इफेक्ट्स के लिए उनका उपयोग करें।
आप कैसे साबित करते हैं कि माइग्रेशन ने व्यावसायिक समय को संरक्षित रखा है?
पहले और बाद में अंतराल गणना, सीमा नमूने, अस्वीकृत-टकराव दर और क्वेरी योजनाओं की तुलना करें। रीड रेप्लिकेट और रिकवरी वातावरण में कवरेज जांच चलाएं। रोलआउट के दौरान, पुराने लॉजिक के साथ मिलान करें; यदि वैध राइट्स अस्वीकार कर दिए जाते हैं, तो इतिहास को हटाए बिना कंस्ट्रेंट स्विच को रोलबैक करें।