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

डेटा मॉडलर की आंखों से छुट्टियां देखना

उत्सव!! पारिवारिक समय!! लम्बी सैर!! समुद्र तट पर एक दिन!! जब हम छुट्टियों के बारे में सोचते हैं तो ये सभी शब्द हमारे दिमाग में गूंजते हैं। क्या आपने कभी सोचा है कि कैसे एक बहुराष्ट्रीय कंपनी दुनिया भर में छुट्टियों का ट्रैक रखती है? इन सभी विवरणों को बनाए रखने के लिए एक डेटा डिक्शनरी होनी चाहिए ताकि वे अपने स्थानीय भागीदारों के साथ निर्बाध व्यापार सुनिश्चित कर सकें।

यह लेख ऐसे डेटा मॉडल की व्याख्या करेगा।

संक्षेप में परियोजना आवश्यकताएँ

इस बार मेरी काफी सरल और सीधी आवश्यकताएं हैं। मुझे कई देशों में छुट्टियों के लिए डेटा डिक्शनरी बनाने की जरूरत है। मैं इसे एक घटक के रूप में बनाना चाहता हूं जिसे जब और जहां आवश्यक हो, मुख्य डेटा मॉडल में एकीकृत किया जा सकता है।

देश भर में छुट्टियों के बारे में कुछ रोचक तथ्यों पर

अपनी परियोजना आवश्यकताओं के संदर्भ में, यह डेटा मॉडलिंग में सबसे सरल समस्याओं में से एक है। फिर भी इसके लिए डेटा मॉडल तैयार करना काफी कठिन है। आमतौर पर छुट्टियां हर साल एक निश्चित तारीख को पड़ती हैं, लेकिन हर देश में हर छुट्टी के लिए ऐसा नहीं होता है। यदि हम विभिन्न देशों में छुट्टियों का विश्लेषण करते हैं, तो हम इस डेटा मॉडल डिज़ाइन में शामिल जटिलताओं को आसानी से देख सकते हैं।

आइए विभिन्न देशों में छुट्टियों के बारे में कुछ रोचक तथ्य देखें:

  • कई छुट्टियां, विशेष रूप से देशभक्त, हर साल एक निश्चित तारीख को मनाई जाती हैं।

    उदाहरण:

    संयुक्त राज्य अमेरिका और भारत में स्वतंत्रता दिवस क्रमशः 4 जुलाई और 15 अगस्त को मनाया जाता है।

  • कुछ छुट्टियां प्रत्येक वर्ष एक विशिष्ट दिन पर मनाई जाती हैं - लेकिन हमेशा एक ही कैलेंडर तिथि नहीं होती हैं।

    उदाहरण:

    संयुक्त राज्य अमेरिका में धन्यवाद दिवस नवंबर में 4 गुरुवार को मनाया जाता है। पिछले साल (2015) यह 26 नवंबर को गिर गया था; इस साल यह 24 नवंबर को है।

  • कुछ छुट्टियां एक वर्ष में एक निश्चित तिथि पर मनाई जाती हैं, लेकिन यदि तिथि शनिवार या रविवार को पड़ती है, तो छुट्टी को जानबूझकर अगले सोमवार को एक लंबा सप्ताहांत मनाने के लिए स्थानांतरित कर दिया जाता है। ऐसे अवकाश को कभी-कभी 'सोमवार'' . कहा जाता है ।

    उदाहरण:

    ऑस्ट्रेलिया और न्यूजीलैंड में, एएनजेडएसी दिवस 6 फरवरी को मनाया जाता है, लेकिन अगर वह तारीख शनिवार या रविवार को पड़ती है, तो छुट्टी एक या दो दिन बाद सोमवार को मनाई जाती है।

    एक और अच्छा उदाहरण चीन में मजदूर दिवस है। यह अवकाश 'सोमवार' भी है।

  • कुछ छुट्टियों की तिथियां एक सप्ताह के लिए स्थानांतरित कर दी जाती हैं यदि वे किसी अन्य अवकाश के साथ टकराती हैं।

    उदाहरण:

    ऑस्ट्रेलिया में परिवार और सामुदायिक दिवस अक्टूबर के पहले सोमवार को मनाया जाता है, लेकिन अगर मजदूर दिवस भी पहले सोमवार को पड़ता है, तो परिवार दिवस अक्टूबर में दूसरे सोमवार को स्थानांतरित कर दिया जाता है।

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

    उदाहरण:

    भारत में मजदूर दिवस 1 मई को मनाया जाता है, जबकि कनाडा में यह सितंबर के पहले सोमवार को मनाया जाता है।

  • कुछ छुट्टियों के दिन-अवकाश पारंपरिक रूप से गैर-अवकाश दिनों के साथ बंडल किए जाते हैं।

    उदाहरण:

    चीन और दक्षिण अफ्रीका में मजदूर दिवस एक दिन मनाया जाता है, लेकिन दो अन्य दिनों की छुट्टी शामिल है।

  • अन्य दिन, जबकि तकनीकी रूप से छुट्टियां नहीं हैं, आमतौर पर गैर-कार्य दिवसों के रूप में अनुमति दी जाती है।

    उदाहरण:

    संयुक्त राज्य अमेरिका में, थैंक्सगिविंग के बाद के शुक्रवार को अनौपचारिक रूप से ब्लैक फ्राइडे के रूप में जाना जाता है। यह कोई सरकारी अवकाश नहीं है, लेकिन कई कंपनियां अपने कर्मचारियों को छुट्टी का दिन देती हैं।

  • कुछ छुट्टियां देश के अलग-अलग क्षेत्रों में अलग-अलग तरीके से मनाई जाती हैं।

    उदाहरण:

    यूके में समर बैंक हॉलिडे स्कॉटलैंड में अगस्त के पहले सोमवार को मनाया जाता है, लेकिन इंग्लैंड, ग्वेर्नसे, जर्सी, उत्तरी आयरलैंड और वेल्स में अगस्त के आखिरी सोमवार को एक ही छुट्टी मनाई जाती है।

  • देश के केवल एक हिस्से में कुछ क्षेत्रीय या स्थानीय छुट्टियां मनाई जाती हैं। इन्हें धार्मिक, जातीय, या सांस्कृतिक कार्यक्रमों से जोड़ा जा सकता है।

    उदाहरण:

    लुई रील दिवस केवल कनाडा के मैनिटोबा प्रांत में मनाया जाता है।

  • कुछ छुट्टियों के लिए कुछ पालन दिवस 'पहले' या 'बाद' की स्थिति पर आधारित होते हैं।

    उदाहरण:

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

    उदाहरण:

    • ईस्टर पूर्णिमा के बाद पहले रविवार को या 21 मार्च के तुरंत बाद मनाया जाता है।
    • दिवाली (एक प्राचीन हिंदू त्योहार) कई दिनों तक मनाया जाता है, हिंदू चंद्र महीने अश्विन के अंत और कार्तिक महीने की शुरुआत से। आमतौर पर, यह ग्रेगोरियन कैलेंडर में मध्य अक्टूबर और मध्य नवंबर के बीच कहीं पड़ता है।
  • रूढ़िवादी क्रिसमस - यह पुराने जूलियन कैलेंडर का अनुसरण करता है। 2016 तक, जूलियन कैलेंडर और ग्रेगोरियन कैलेंडर के बीच 13 दिनों का अंतर है। नतीजतन, रूढ़िवादी क्रिसमस 7 जनवरी, 2016 को पड़ता है।

तथ्यों को सारांशित करना

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

संक्षेप में, देशों में छुट्टियों को उनकी तिथियों के आधार पर वर्गीकृत किया जा सकता है:

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

हम छुट्टियों को कहां . के आधार पर दो श्रेणियों में बांट सकते हैं वे देखे जाते हैं:

  • राष्ट्रीय अवकाश - छुट्टियाँ जो देश स्तर पर मनाई जाती हैं।
  • क्षेत्रीय या स्थानीय अवकाश - छुट्टियां जो किसी देश के किसी विशेष राज्य या क्षेत्र में मनाई जाती हैं।

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

इस बिंदु पर, हमें विशिष्ट व्यावसायिक क्षेत्रों के लिए कुछ सैद्धांतिक परिदृश्यों पर भी विचार करना चाहिए। उदाहरण के लिए:

  • कुछ देशों में, बैंकों और अन्य वित्तीय संस्थानों को प्रत्येक तिमाही के पहले दिन एक दिन की छुट्टी दी जाती है।
  • कुछ संगठन अपने तिमाही परिणाम प्रकाशित करने के बाद एक दिन की छुट्टी देते हैं।

हम सुनिश्चित करेंगे कि ये बिंदु हमारे डेटा मॉडल डिज़ाइन में भी शामिल हैं।

एक व्यापक अवकाश डेटा मॉडल तैयार करना

डेटा मॉडल को डिजाइन करते समय, मैं यूएस कन्वेंशन का उपयोग करूंगा कि सप्ताह रविवार से शुरू होता है। बाद में जरूरत पड़ने पर इसे बदलना ज्यादा मुश्किल नहीं होगा।

यह संपूर्ण डेटा मॉडल तीन विषय क्षेत्रों के इर्द-गिर्द घूमेगा:"कैलेंडर", "हॉलिडे" और "कंट्री"।

“कैलेंडर” विषय क्षेत्र

इस क्षेत्र में, calendar जो कई सालों तक खजूर को स्टोर करता है। पूर्व-गणना किए गए संख्यात्मक मानों को संग्रहीत करने के लिए कुछ अतिरिक्त कॉलम भी होंगे, जो हमें कुछ चलने योग्य छुट्टियों के लिए तिथियां प्राप्त करने में मदद करेंगे। कॉलम इस प्रकार हैं:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

इस विषय क्षेत्र में दो और टेबल हैं:day_of_week और month_of_year

जैसा कि उनके नाम से पता चलता है, हम इन तालिकाओं में अलग-अलग दिनों और महीनों का विवरण संग्रहीत करेंगे। इसलिए, उनके पास हमेशा क्रमशः 7 और 12 रिकॉर्ड होंगे। इस अनुभाग के लिए ध्यान रखने योग्य कुछ बातें हैं:

  • हम इन दोनों तालिकाओं में अनुक्रम कॉलम के माध्यम से सप्ताह की शुरुआत को कॉन्फ़िगर कर सकते हैं। हम साल की शुरुआत के साथ भी ऐसा ही कर सकते हैं।
  • दोनों तालिकाओं की प्राथमिक कुंजी calendar टेबल। वे सप्ताह के दिनों और वर्ष के महीनों के लिए संख्यात्मक मान संग्रहीत करते हैं।
  • एक वर्ष का मूल्य calendar_date . से निकाला जा सकता है कॉलम, लेकिन मैं अभी भी calendar_year . रखता हूं एक अलग कॉलम के रूप में। यह हमें इस कॉलम पर तालिका को विभाजित करने की अनुमति देता है, जो बदले में अंतर्निहित SQL के लिए बेहतर प्रदर्शन को सक्षम बनाता है।
  • संख्या कॉलम के आकार को कॉलम के संभावित मानों के आधार पर परिभाषित किया गया है। उदाहरण के लिए, day_of_year 1 और 365 के बीच कुछ मान होना चाहिए, इसलिए मैं संख्या (3) को कॉलम के डेटाटाइप के रूप में परिभाषित करता हूं।

"अवकाश" विषय क्षेत्र

जैसा कि हमने पहले कहा, छुट्टियां दो तरह की होती हैं- फिक्स और मूवेबल। इसलिए हम दो अलग-अलग टेबल बनाएंगे, प्रत्येक प्रकार के लिए एक।

holiday_fixed तालिका day_of_month uses का उपयोग करती है और month_of_year_id कॉलम दिन और महीने के लिए संख्यात्मक मान संग्रहीत करने के लिए। इन मूल्यों का उपयोग करके, हम एक निश्चित अवकाश के लिए एक तिथि प्राप्त कर सकते हैं।

इसी तरह, holiday_moveable तालिका प्रत्येक चलने योग्य अवकाश के लिए एक तिथि प्राप्त करने के लिए निम्नलिखित स्तंभों का उपयोग करेगी:

is_bank_holiday कॉलम दर्शाता है कि क्या अवकाश बैंक अवकाश है, अर्थात उस दिन सभी वित्तीय संस्थान बंद रहते हैं। यह कॉलम दोनों तालिकाओं में आवश्यक है।

is_mondayized कॉलम उन छुट्टियों की तारीख को संशोधित करता है जो शनिवार या रविवार को पड़ती हैं लेकिन अगले सोमवार को मनाई जाती हैं।

चलिए एक और टेबल भी बनाते हैं, जिसका नाम है holiday_miscellaneous , गैर-ग्रेगोरियन कैलेंडर के आधार पर छुट्टियों के रिकॉर्ड संग्रहीत करने के लिए। रिकॉर्ड इस तालिका में मैन्युअल रूप से डाले जाएंगे।

इन तीनों तालिकाओं में holiday_category टेबल। यह छुट्टी की प्रकृति पर डेटा रखता है। यहां विभिन्न श्रेणियां हो सकती हैं, जिनमें शामिल हैं:

  • सार्वजनिक / बैंक अवकाश - बैंक आधिकारिक तौर पर बंद हैं और कोई व्यापार नहीं होता है।
  • राज्य अवकाश - केवल राज्य स्तर पर सार्वजनिक अवकाश।
  • राष्ट्रीय अवकाश - आम तौर पर देशभक्ति की सालगिरह या कानून द्वारा परिभाषित एक दिन जिसे पूरे देश में मनाया जाता है।
  • स्थानीय अवकाश - स्थानीय सरकार द्वारा घोषित, और केवल एक विशिष्ट क्षेत्र में मनाया जाता है।
  • पालन - छुट्टियां जो उनकी वास्तविक तिथियों पर नहीं, बल्कि किसी अन्य दिन (अक्सर सोमवार) मनाई जाती हैं। आमतौर पर लोगों को तीन दिन का सप्ताहांत बिताने की अनुमति देता है।

आपने देखा होगा state_id तीनों हॉलिडे टेबल में कॉलम। आइए अगले भाग में इस कॉलम के महत्व के बारे में बात करते हैं।

"देश" विषय क्षेत्र

इस विषय क्षेत्र में हमारे पास दो टेबल हैं:

  1. country - जो देश के नाम और आईडी स्टोर करता है;
  2. state - जो प्रत्येक देश के लिए राज्य और/या क्षेत्र के नाम और आईडी संग्रहीत करता है।

अंत में, हम इस state यह निर्धारित करने के लिए कि अवकाश किस क्षेत्र, राज्य और देश से संबंधित है, सभी तीन अवकाश तालिकाओं में तालिका।

चूंकि कई छुट्टियां देश स्तर पर मनाई जाती हैं, इसलिए ऐसी छुट्टियों के लिए राज्य-स्तरीय रिकॉर्ड को holiday टेबल। यह बेहद बेमानी हो जाएगा। इसके बजाय, हमारे पास state राज्य के नाम के रूप में 'ALL' के साथ तालिका। इस रिकॉर्ड को उस देश की सभी छुट्टियों के साथ मैप किया जा सकता है, इस प्रकार holiday अनावश्यक रूप से तालिका।

अंतिम अवकाश डेटा मॉडल

आइए यहां संपूर्ण अवकाश डेटा मॉडल पर एक नज़र डालें:




ऐसे कई तरीके हैं जिनसे हम इस मॉडल के साथ खेल सकते हैं। उदाहरण के लिए:

  • पोलैंड जैसे किसी विशेष देश में मनाई गई सभी छुट्टियों की सूची प्राप्त करें।

    Select hm.holiday_name, calendar_date, hm.is_bank_holiday from calendar c, holiday_moveable hm
    Where hm.month_of_year_id = c.month_of_year_id
    and hm.day_of_week_id =c.day_of_week_id
    and c.calendar_year = 2016
    And hm.state_id = (select state_id from state s, country c where s.country_id = c.id and c.country_name = ‘POLAND’ )
    UNION ALL
    Select hf.holiday_name, calendar_date, hf.is_bank_holiday from calendar c, holiday_fixed hm
    Where hm.month_of_year_id = c.month_of_year_id
    and hm.day_of_month = to_number(to_char(c.calendar_date,’DD’))
    and c.calendar_year = 2016
    And hm.state_id = (select state_id from state s, country c where s.country_id = c.id and c.country_name = ‘POLAND’)
    ;
    

  • 2018 में थैंक्सगिविंग डे की तारीख खोजें - याद रखें, यह नवंबर में चौथे गुरुवार को अमेरिका के सभी राज्यों में मनाया जाता है।

    Select hm.holiday_name, calendar_date, hm.is_bank_holiday from calendar c, holiday_moveable hm
    Where hm.month_of_year_id = c.month_of_year_id
    And hm.day_of_week_id =c.day_of_week_id
    And c.calendar_year = 2018
    And hm.holiday_name = ‘THANKSGIVING’
    And hm.state_id = (select state_id from state s, country c where s.country_id = c.id and c.country_name = ‘USA’ )
    

  • सभी देशों में स्वतंत्रता दिवस कब मनाया जाता है, इसकी सूची प्राप्त करें। आमतौर पर, यह हर साल एक निश्चित तारीख को होता है, और देश के सभी क्षेत्रों में इस दिन को सख्ती से मनाया जाता है।

    Select c.country_name, calendar_date from calendar c, holiday_fixed hf, state s, country c
    Where hf.state_id = s.id and s.country_id = c.id
    And s.state_name = ‘ALL’
    And c.month_of_year_id = hf.month_of_year_id
    And c.day_of_month = trunc(calendar_date)
    And hf.holiday_name = ‘INDEPENDENCE DAY’
    and c.calendar_year = 2016;
    

हॉलिडे डेटा मॉडल का उपयोग करना

क्या आप इस डेटा मॉडल के साथ खेलना चाहेंगे? इसका लाभ उठाएं। यहां कुछ ऐसे प्रश्न दिए गए हैं जिन पर हमने विचार किया:

  • विभिन्न देशों में मजदूर दिवस मनाए जाने की तारीखों का पता लगाएं।
  • यूके के हर हिस्से के लिए 2016 की सभी छुट्टियों की सूची प्राप्त करें।
  • 2016 में फ़्रांस में मनाई गई सभी बैंक छुट्टियों की सूची बनाएं।
  • 2016 में कनाडा के मैनिटोबा प्रांत में मनाई गई सभी छुट्टियों की सूची प्राप्त करें।

आपने अपने आवेदन में छुट्टियों के विवरण को कैसे संग्रहीत किया? मुझे आपके विचार सुनना अच्छा लगेगा। कृपया, इस मेटाडेटा को संग्रहीत करने के साथ-साथ हमारे समाधान पर अपना अनुभव साझा करने के लिए स्वतंत्र महसूस करें।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पुरानी रिपोर्ट को ठीक करने के लिए AT TIME ZONE का उपयोग करना

  2. Salesforce और Azure Active Directory (AD) सिंगल साइन ऑन (SSO) के साथ ODBC का उपयोग करना

  3. समूहबद्ध चल रहे MAX (या MIN) को बनाए रखना

  4. अनुक्रमिक थ्रूपुट गति और फ़ीड

  5. फील्डशील्ड में प्रॉक्सी-आधारित गतिशील डेटा मास्किंग