sql >> Databasteknik >  >> RDS >> Database

Se semester med datamodellerarens ögon

Firande!! Familjetid!! Lång körning!! En dag på stranden!! Alla dessa ord surrar i våra sinnen när vi tänker på semester. Har du någonsin funderat på hur ett multinationellt företag håller reda på helgdagar över hela världen? Det måste finnas en dataordbok för att behålla alla dessa detaljer så att de kan säkerställa sömlösa affärer med sina lokala partners.

Den här artikeln kommer att förklara en sådan datamodell.

Projektets krav i ett nötskal

Jag har ganska enkla och okomplicerade krav den här gången. Jag behöver bygga en dataordbok för helgdagar i många länder. Jag vill bygga den som en komponent som kan integreras i huvuddatamodellen när och där det behövs.

Om några intressanta fakta om semester i olika länder

När det gäller dess projektkrav är detta ett av de enklaste problemen inom datamodellering. Ändå är det svårt nog att designa en datamodell för det. Vanligtvis infaller helgdagar på ett fast datum varje år, men detta är inte fallet för varje helgdag i alla länder. Om vi ​​analyserar semestrar i olika länder kan vi enkelt förutse komplikationerna i denna datamodelldesign.

Låt oss ta en titt på några intressanta fakta om semester i olika länder:

  • Många helgdagar, särskilt patriotiska, hålls på ett fast datum varje år.

    Exempel:

    Självständighetsdagen i USA och Indien firas den 4 juli respektive 15 augusti.

  • Vissa helgdagar firas en specifik dag varje år – men inte alltid samma kalenderdatum.

    Exempel:

    Thanksgiving day i USA firas den 4 torsdagen i november. Förra året (2015) inföll detta den 26 november; i år blir det den 24 november.

  • Vissa helgdagar firas på ett fast datum på ett år, men om datumet infaller på lördag eller söndag flyttas helgdagen med avsikt till följande måndag för att hålla en långhelg. En sådan högtid kallas ibland för ’måndag’ .

    Exempel:

    I Australien och Nya Zeeland firas ANZAC-dagen den 6 februari, men skulle det infalla på lördag eller söndag, firas helgdagen på måndagen en eller två dagar senare.

    Ett annat bra exempel är Labor Day i Kina. Denna helgdag är också "måndag".

  • Datumen för vissa helgdagar flyttas med en vecka om de krockar med någon annan helgdag.

    Exempel:

    Familje- och samhällsdagen i Australien firas den första måndagen i oktober, men om Labor Day också infaller på den första måndagen, flyttas familjedagen till den andra måndagen i oktober.

  • Alla helgdagar är inte helgdagar , dvs helgdagar när banker, finansiella institut, aktiemarknader och regeringskontor är stängda. (I USA och Kanada är helgdagar kända som federala eller lagstadgade helgdagar.)
  • Fosterländska helgdagar hålls strikt på samma datum varje år. Alla institut och kontor (inklusive banker) i alla regioner i landet är stängda den dagen. Men i vissa länder, som USA och Kanada, om dessa helgdagar infaller på en helg, kommer de också att hållas på följande måndag – det vill säga, banker och regeringskontor kommer att vara stängda den måndagen.
  • Helgdagar med samma namn observeras på olika dagar i olika länder.

    Exempel:

    Labor Day firas den 1 maj i Indien, medan den firas den första måndagen i september i Kanada.

  • Vissa lediga helgdagar är traditionellt kombinerade med lediga dagar.

    Exempel:

    Labor Day i Kina och Sydafrika firas en dag, men två andra lediga dagar ingår.

  • Andra dagar, även om de tekniskt sett inte är helgdagar, är vanligtvis tillåtna som icke-arbetsdagar.

    Exempel:

    I USA är fredagen efter Thanksgiving inofficiellt känd som Black Friday. Det är inte en statlig helgdag, men många företag ger sina anställda en ledig dag.

  • Vissa helgdagar observeras olika i olika regioner inom ett land.

    Exempel:

    Sommarlov i Storbritannien firas den första måndagen i augusti i Skottland, men samma helgdag firas den sista måndagen i augusti i England, Guernsey, Jersey, Nordirland och Wales.

  • Vissa regionala eller lokala helgdagar observeras i bara en del av ett land. Dessa kan vara kopplade till religiösa, etniska eller kulturella evenemang.

    Exempel:

    Louis Riel-dagen firas endast i den kanadensiska provinsen Manitoba.

  • Vissa helgdagar är baserade på ett "före" eller "efter"-villkor.

    Exempel:

    • National Patriot's Day firas i den kanadensiska provinsen Quebec på måndagen före den 25 maj.
    • Omvändelsedagen i Tyskland firas på onsdagen omedelbart före 23 november.
    • Jeune Genevois i Schweiz observeras torsdagen efter första söndagen i september.
  • Vissa helgdagar är baserade på äldre kalendrar som inte matchar den vanligt använda gregorianska kalendern. Därför varierar deras datum varje år.

    Exempel:

    • Påsk firas den första söndagen efter att fullmånen inträffade den 21 mars eller snarast efter.
    • Diwali (en gammal hinduisk festival) firas under flera dagar, från slutet av den hinduiska månmånaden Ashvin och början av månaden Kartika. Vanligtvis infaller detta någonstans mellan mitten av oktober och mitten av november i den gregorianska kalendern.
  • Ortodox jul – Detta följer den äldre julianska kalendern. Från och med 2016 är det en skillnad på 13 dagar mellan den julianska kalendern och den gregorianska kalendern. Som ett resultat infaller ortodox jul den 7 januari 2016.

Sammanfattning av fakta

Det är viktigt att notera att Jag överväger endast den internationellt accepterade gregorianska kalendern (som följer solcykeln) för att automatisera datapopulationen för semester i år och länder. I den här artikeln överväger jag inte lunisolära, hebreiska eller hinduiska kalendrar (som följer månens cykel). Dessa kalendrar följs dock i specifika regioner i världen. För närvarande kan helger baserade på dessa kalendrar matas in i systemet manuellt .

Sammanfattningsvis kan helgdagar i olika länder kategoriseras baserat på hur deras datum härrör:

  • Fasta helgdagar – Helgdagar som inträffar på ett fast datum varje år.
  • Rörliga helgdagar – Helgdagar som infaller på en viss dag, som den första måndagen i februari eller tredje torsdagen i november.
  • Justerbara helgdagar – Helgdagar som faller under någon av kategorierna, men som ibland observeras på andra dagar för att undvika kollision med andra högtider (eller kolliderar med helgen) eller flyttas till nästa vecka på grund av kollision med andra helgdagar på samma datum.
  • Semester baserad på andra kalendrar – Helgdagar som är baserade på månkalendern, den ortodoxa eller hinduiska kalendern. För närvarande matas dessa manuellt in i vår modell.

Vi kan ytterligare dela in helgdagar i två kategorier baserat på var de observeras:

  • Nationella helgdagar – Helgdagar som hålls på landsnivå.
  • Regionala eller lokala helgdagar – Helgdagar som iakttas i en viss stat eller region i ett land.

I nästan alla länder uppmärksammas nationella och regionala helgdagar som helgdagar på lands- eller regionalnivå. Alla helgdagar är dock inte helgdagar, så vi bör ange vilka helgdagar som är helgdagar och vilka som inte är det.

Vid denna tidpunkt bör vi också överväga några teoretiska scenarier för specifika affärsområden. Till exempel:

  • I vissa länder får banker och andra finansinstitutioner en ledig dag den första dagen i varje kvartal.
  • Vissa organisationer ger en ledig dag efter att ha publicerat sina kvartalsresultat.

Vi kommer att se till att dessa punkter också ingår i vår datamodelldesign.

Utforma en omfattande semesterdatamodell

När jag utformar datamodellen kommer jag att använda den amerikanska konventionen att veckan börjar på söndag. Det kommer inte att vara alltför svårt att ändra detta senare om det behövs.

Hela denna datamodell kommer att kretsa kring tre ämnesområden:"Kalender", "Semester" och "Land".

Ämnesområdet "Kalender"

I det här området finns en huvudtabell som heter calendar som lagrar dadlar i många år. Det kommer också att finnas några ytterligare kolumner för att lagra förberäknade numeriska värden, vilket hjälper oss att härleda datum för vissa flyttbara helgdagar. Kolumnerna är följande:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Det finns ytterligare två tabeller i detta ämnesområde:day_of_week och month_of_year .

Som deras namn antyder kommer vi att lagra detaljer om enskilda dagar och månader i dessa tabeller. Därför kommer de alltid att ha 7 respektive 12 poster. Några saker att tänka på för det här avsnittet är:

  • Vi kan konfigurera veckans början med hjälp av en sekvenskolumn i båda dessa tabeller. Vi kan göra detsamma med början av året.
  • De primära nycklarna för båda tabellerna hänvisas till i calendar tabell. De lagrar numeriska värden för veckodagar och månader på året.
  • Värdet av ett år kan extraheras från calendar_date kolumn, men jag behåller fortfarande calendar_year som en separat kolumn. Detta gör att vi kan partitionera tabellen i den här kolumnen, vilket i sin tur möjliggör bättre prestanda för underliggande SQL:er.
  • Storleken på nummerkolumner har definierats baserat på möjliga värden för kolumnen. Till exempel, day_of_year måste vara något värde mellan 1 och 365, så jag definierar nummer(3) som kolumnens datatyp.

Ämnesområdet "Semester"

Som vi sa tidigare finns det två typer av semester – fast och flyttbar. Så vi skapar två olika tabeller, en för varje typ.

holiday_fixed Tabellen använder day_of_month och month_of_year_id kolumner för att lagra numeriska värden för dag och månad. Med hjälp av dessa värden kan vi härleda ett datum för en fast helgdag.

På liknande rader, holiday_moveable Tabell kommer att använda följande kolumner för att härleda ett datum för varje flyttbar helgdag:

The is_bank_holiday kolumnen anger om semestern är en helgdag, dvs alla finansinstitut är stängda den dagen. Denna kolumn krävs i båda tabellerna.

is_mondayized kolumnen ändrar datumet för helgdagar som infaller på en lördag eller söndag men som hålls på följande måndag.

Låt oss också skapa en annan tabell, nämligen holiday_miscellaneous , för att lagra poster för helgdagar baserade på icke-gregorianska kalendrar. Poster kommer att infogas i den här tabellen manuellt.

Alla dessa tre tabeller har en kolumn som hänvisar till holiday_category tabell. Detta innehåller uppgifter om semesterns karaktär. Det kan finnas olika kategorier här, inklusive:

  • Allmän helgdag – Bankerna är officiellt stängda och ingen handel äger rum.
  • Statlig helgdag – Helgdagar på endast statlig nivå.
  • Nationell helgdag – Vanligtvis en patriotisk årsdag eller en dag definierad i lag som firas i hela landet.
  • Lokal helgdag – Deklareras av lokala myndigheter och observeras endast i en specifik region.
  • Iakttagande – Helgdagar som inte firas på sina faktiska datum, utan någon annan dag (ofta måndag). Tillåter vanligtvis att folk har en tredagars helg.

Du måste ha lagt märke till state_id kolumn i alla tre semestertabellerna. Låt oss prata om betydelsen av denna kolumn i nästa avsnitt.

Ämnesområdet "Land"

Vi har två tabeller inom detta ämnesområde:

  1. country – som lagrar landsnamn och ID;
  2. state – som lagrar delstats- och/eller regionnamn och ID:n för varje enskilt land.

Så småningom kommer vi att hänvisa till detta state tabell i alla tre helgdagstabellerna för att avgöra vilken region, stat och land en helgdag tillhör.

Eftersom många helgdagar firas på landsnivå är det inte meningsfullt att föra register på statlig nivå för sådana helgdagar under holiday tabell. Det skulle bli extremt överflödigt. Istället kan vi ha en post i state tabell med "ALLA" som tillståndsnamn. Denna post kan kartläggas med alla helgdagar i det landet, vilket eliminerar behovet av att föra stora register under holiday bord i onödan.

Den slutliga semesterdatamodellen

Låt oss ta en titt på den kompletta semesterdatamodellen här:




Det finns flera sätt vi kan leka med den här modellen. Till exempel:

  • Få en lista över alla helgdagar som observerats i ett visst land, säg Polen.

    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’)
    ;
    

  • Hitta datumet för Thanksgiving Day 2018 – Kom ihåg att detta firas i alla delstater i USA den fjärde torsdagen i november.

    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’ )
    

  • Få en lista över när självständighetsdagen firas i alla länder. Vanligtvis är detta på ett fast datum varje år, och dagen hålls strikt i alla delar av landet.

    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;
    

Använda semesterdatamodellen

Skulle du vilja leka med denna datamodell? Kör hårt. Här är bara några av de frågor vi tänkte på:

  • Ta reda på vilka datum Labor Day firas i olika länder.
  • Få en lista över alla helgdagar 2016 för alla delar av Storbritannien.
  • Skapa en lista över alla helgdagar som observerades i Frankrike 2016.
  • Få listan över alla helgdagar som observerades i den kanadensiska provinsen Manitoba 2016.

Hur lyckades du lagra semesterinformation i din ansökan? Jag skulle älska att höra dina idéer. Dela gärna med dig av din erfarenhet av att lagra denna metadata samt din syn på vår lösning.


  1. En översikt över uppdragens senaste databasövervakningstjänst - Spotlight Cloud

  2. hur man använder kontrollbegränsning i Oracle

  3. Hur TRIM() fungerar i MariaDB

  4. Oracle 10g - optimera WHERE IS NOT NULL