Database
 sql >> Database >  >> RDS >> Database

Visualizzazione delle vacanze con gli occhi di Data Modeler

Celebrazione!! Tempo per la famiglia!! Lungo viaggio!! Un giorno in spiaggia!! Tutte queste parole ci tornano in mente quando pensiamo alle vacanze. Hai mai pensato a come una multinazionale tiene traccia delle vacanze in tutto il mondo? Ci deve essere un dizionario di dati per mantenere tutti questi dettagli in modo che possano garantire affari senza interruzioni con i loro partner locali.

Questo articolo spiegherà un tale modello di dati.

I requisiti del progetto in breve

Ho requisiti abbastanza semplici e diretti questa volta. Ho bisogno di creare un dizionario di dati per le vacanze in molti paesi. Voglio costruirlo come un componente che può essere integrato nel modello di dati principale quando e dove richiesto.

Alcuni fatti interessanti sulle vacanze in diversi paesi

In termini di requisiti di progetto, questo è uno dei problemi più semplici nella modellazione dei dati. Eppure è già abbastanza difficile progettare un modello di dati per questo. Di solito le vacanze cadono in una data fissa ogni anno, ma questo non è il caso di tutte le festività in ogni paese. Se analizziamo le vacanze in vari paesi, possiamo facilmente prevedere le complicazioni coinvolte nella progettazione di questo modello di dati.

Diamo un'occhiata ad alcuni fatti interessanti sulle vacanze in vari paesi:

  • Molte festività, soprattutto patriottiche, si celebrano ogni anno a una data fissa.

    Esempio:

    Il Giorno dell'Indipendenza negli Stati Uniti e in India si celebra rispettivamente il 4 luglio e il 15 agosto.

  • Alcune festività vengono celebrate in un giorno specifico ogni anno, ma non sempre nella stessa data di calendario.

    Esempio:

    Il giorno del Ringraziamento negli Stati Uniti si celebra il 4 giovedì di novembre. L'anno scorso (2015) questo è caduto il 26 novembre; quest'anno sarà il 24 novembre.

  • Alcune festività vengono celebrate a una data fissa in un anno, ma se la data cade di sabato o di domenica, la festa viene volutamente spostata al lunedì successivo per osservare un weekend lungo. Tale vacanza è talvolta chiamata "Mondayized" .

    Esempi:

    In Australia e Nuova Zelanda, l'ANZAC Day viene celebrato il 6 febbraio, ma se tale data cade di sabato o domenica, la festa viene osservata il lunedì uno o due giorni dopo.

    Un altro buon esempio è la festa del lavoro in Cina. Questa festività è anche "lunedificata".

  • Le date di alcune festività vengono spostate di una settimana se si scontrano con altre festività.

    Esempio:

    Il Family and Community Day in Australia viene celebrato il primo lunedì di ottobre, ma se anche il Labor Day cade il primo lunedì, il Family Day viene spostato al secondo lunedì di ottobre.

  • Non tutti i giorni festivi vengono considerati festivi bancari , ovvero i giorni festivi in ​​cui banche, istituti finanziari, mercati azionari e uffici governativi sono chiusi. (Negli Stati Uniti e in Canada, i giorni festivi sono noti come festività federali o legali.)
  • Le feste patriottiche sono rigorosamente osservate ogni anno nella stessa data. Tutti gli istituti e gli uffici (comprese le banche) in tutte le regioni del paese sono chiusi quel giorno. Tuttavia, in alcuni paesi, come Stati Uniti e Canada, se queste festività cadono in un fine settimana, verranno osservate anche il lunedì successivo, ovvero le banche e gli uffici governativi rimarranno chiusi quel lunedì.
  • Le festività con lo stesso nome vengono osservate in giorni diversi in paesi diversi.

    Esempio:

    La festa del lavoro si celebra il 1 maggio in India, mentre in Canada si celebra il primo lunedì di settembre.

  • Alcuni giorni festivi sono tradizionalmente combinati con giorni liberi non festivi.

    Esempio:

    La festa del lavoro in Cina e Sud Africa viene celebrata un giorno, ma sono inclusi altri due giorni liberi.

  • Gli altri giorni, anche se tecnicamente non festivi, sono normalmente ammessi come giorni non lavorativi.

    Esempio:

    Negli Stati Uniti, il venerdì dopo il Ringraziamento è conosciuto ufficiosamente come Black Friday. Non è una festa del governo, ma molte aziende concedono un giorno libero ai propri dipendenti.

  • Alcune festività vengono osservate in modo diverso nelle diverse regioni all'interno di un paese.

    Esempio:

    Il giorno festivo estivo nel Regno Unito si celebra il primo lunedì di agosto in Scozia, ma lo stesso giorno festivo si osserva l'ultimo lunedì di agosto in Inghilterra, Guernsey, Jersey, Irlanda del Nord e Galles.

  • Alcune festività regionali o locali si osservano solo in una parte di un paese. Questi possono essere collegati a eventi religiosi, etnici o culturali.

    Esempio:

    Il Louis Riel Day si celebra solo nella provincia canadese di Manitoba.

  • Alcuni giorni di osservanza per determinate festività si basano su una condizione "prima" o "dopo".

    Esempi:

    • La festa nazionale del patriota si celebra nella provincia canadese del Quebec il lunedì prima il 25 maggio.
    • Il giorno del pentimento in Germania si celebra il mercoledì immediatamente prima 23 novembre.
    • Jeune Genevois in Svizzera si osserva il giovedì seguente la prima domenica di settembre.
  • Alcuni giorni di festa si basano su calendari più vecchi che non corrispondono al calendario gregoriano comunemente usato. Pertanto, le loro date variano ogni anno.

    Esempi:

    • La Pasqua si celebra la prima domenica dopo il plenilunio che cade il 21 marzo o subito dopo.
    • Il Diwali (un'antica festa indù) si celebra in diversi giorni, dalla fine del mese lunare indù di Ashvin all'inizio del mese di Kartika. Di solito, questo cade da metà ottobre a metà novembre nel calendario gregoriano.
  • Natale ortodosso – Questo segue il vecchio calendario giuliano. A partire dal 2016, c'è una differenza di 13 giorni tra il calendario giuliano e il calendario gregoriano. Di conseguenza, il Natale ortodosso cade il 7 gennaio 2016.

Riassumere i fatti

È importante notare che sto considerando solo il calendario gregoriano accettato a livello internazionale (che segue il ciclo solare) per automatizzare la popolazione di dati per le vacanze per anni e paesi. In questo articolo, non sto considerando i calendari lunisolari, ebraici o indù (che seguono il ciclo lunare). Tuttavia, questi calendari vengono seguiti in specifiche regioni del globo. Per ora, le vacanze basate su questi calendari possono essere inserite manualmente nel sistema .

Per riassumere, le vacanze in tutti i paesi possono essere classificate in base a come vengono derivate le loro date:

  • Festività fisse – Festività che si verificano ogni anno a una data fissa.
  • Festività mobili – Festività che cadono in un giorno specifico, come il primo lunedì di febbraio o il terzo giovedì di novembre.
  • Festività regolabili – Festività che rientrano in una delle due categorie, ma a volte vengono osservate in altri giorni per evitare di scontrarsi con altre celebrazioni (o scontrarsi con il fine settimana) o spostate alla settimana successiva a causa dello scontro con altre festività nella stessa data.
  • Vacanze basate su altri calendari – Osservazioni festive basate sul calendario lunare, ortodosso o indù. Per ora, questi vengono inseriti manualmente nel nostro modello.

Possiamo ulteriormente suddividere le vacanze in due categorie in base a dove si osservano:

  • Festività nazionali – Festività osservate a livello nazionale.
  • Festività regionali o locali – Festività osservate in un determinato stato o regione di un paese.

In quasi tutti i paesi, le festività nazionali e regionali sono osservate come festività bancarie a livello nazionale o regionale. Tuttavia, non tutti i giorni festivi sono giorni festivi, quindi dovremmo designare quali giorni festivi sono giorni festivi e quali no.

A questo punto, dovremmo considerare anche alcuni scenari teorici per specifiche aree di business. Ad esempio:

  • In alcuni paesi, banche e altri istituti finanziari hanno un giorno libero il primo giorno di ogni trimestre.
  • Alcune organizzazioni concedono un giorno libero dopo aver pubblicato i risultati trimestrali.

Ci assicureremo che questi punti siano inclusi anche nella nostra progettazione del modello di dati.

Progettazione di un modello completo di dati sulle vacanze

Durante la progettazione del modello di dati, utilizzerò la convenzione statunitense che la settimana inizia di domenica. Non sarà troppo difficile cambiarlo in seguito, se necessario.

L'intero modello di dati ruoterà attorno a tre aree tematiche:"Calendario", "Vacanze" e "Paese".

L'area tematica "Calendario"

In quest'area è presente una tabella principale denominata calendar che memorizza le date per molti anni. Ci saranno anche alcune colonne aggiuntive per memorizzare valori numerici precalcolati, che ci aiuteranno a ricavare date per determinate festività mobili. Le colonne sono le seguenti:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Ci sono altre due tabelle in questa area tematica:day_of_week e month_of_year .

Come suggeriscono i loro nomi, memorizzeremo i dettagli dei singoli giorni e mesi in queste tabelle. Pertanto, avranno sempre rispettivamente 7 e 12 record. Alcune cose da tenere a mente per questa sezione sono:

  • Possiamo configurare l'inizio della settimana tramite una colonna di sequenza in entrambe queste tabelle. Possiamo fare lo stesso con l'inizio dell'anno.
  • Le chiavi primarie di entrambe le tabelle sono indicate nel calendar tavolo. Memorizzano valori numerici per giorni della settimana e mesi dell'anno.
  • Il valore di un anno può essere estratto dal calendar_date colonna, ma conservo ancora calendar_year come colonna separata. Questo ci consente di partizionare la tabella su questa colonna, che a sua volta consente prestazioni migliori per gli SQL sottostanti.
  • La dimensione delle colonne dei numeri è stata definita in base ai possibili valori per la colonna. Ad esempio, il day_of_year deve essere un valore compreso tra 1 e 365, quindi definisco numero(3) come tipo di dati della colonna.

L'area tematica "Vacanze"

Come abbiamo detto prima, ci sono due tipi di ferie:fisse e mobili. Quindi creeremo due tabelle diverse, una per ogni tipo.

Il holiday_fixed la tabella utilizza day_of_month e month_of_year_id colonne per memorizzare i valori numerici per giorno e mese. Utilizzando questi valori, possiamo ricavare una data per una vacanza fissa.

Su linee simili, il holiday_moveable tabella utilizzerà le seguenti colonne per ricavare una data per ogni festività mobile:

Il is_bank_holiday la colonna indica se il giorno festivo è un giorno festivo, ovvero tutte le istituzioni finanziarie sono chiuse in quel giorno. Questa colonna è obbligatoria in entrambe le tabelle.

Il is_mondayized la colonna modifica la data delle festività che cadono di sabato o domenica ma si osservano il lunedì successivo.

Creiamo anche un'altra tabella, ovvero holiday_miscellaneous , per archiviare i record per le festività in base a calendari non gregoriani. I record verranno inseriti in questa tabella manualmente.

Tutte queste tre tabelle hanno una colonna che fa riferimento a holiday_category tavolo. Contiene dati sulla natura della vacanza. Ci possono essere varie categorie qui, tra cui:

  • Pubblico / Festivo – Le banche sono ufficialmente chiuse e non si svolgono negoziazioni.
  • Festività di Stato – Giorni festivi a livello statale.
  • Festa Nazionale – Generalmente un anniversario patriottico o un giorno definito dalla legge che viene celebrato a livello nazionale.
  • Festività locale – Dichiarato dal governo locale e osservato solo in una regione specifica.
  • Osservanza – Festività che non vengono celebrate nelle date effettive, ma in un altro giorno (spesso lunedì). Di solito permette alle persone di avere un weekend di tre giorni.

Devi aver notato lo state_id colonna in tutte e tre le tabelle delle festività. Parliamo del significato di questa colonna nella prossima sezione.

L'area tematica "Paese"

Abbiamo due tabelle in questa area tematica:

  1. country – che memorizza i nomi e gli ID dei paesi;
  2. state – che memorizza i nomi e gli ID di stato e/o regione per ogni singolo paese.

Alla fine, faremo riferimento a questo state tabella in tutte e tre le tabelle delle festività per determinare a quale regione, stato e paese appartiene una vacanza.

Poiché molte festività vengono celebrate a livello nazionale, non ha senso tenere registri a livello statale per tali festività nel holiday tavolo. Diventerebbe estremamente ridondante. Invece, possiamo avere un record nello state tabella con 'ALL' come nome di stato. Questo record può essere mappato con tutte le festività di quel paese, eliminando così la necessità di conservare enormi record nelle holiday tabella inutilmente.

Il modello di dati delle festività finali

Diamo un'occhiata al modello completo dei dati delle vacanze qui:




Ci sono diversi modi in cui possiamo giocare con questo modello. Ad esempio:

  • Ottieni un elenco di tutte le festività osservate in un determinato paese, ad esempio in Polonia.

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

  • Trova la data del Giorno del Ringraziamento nel 2018 – Ricorda, questo viene celebrato in tutti gli stati degli Stati Uniti il ​​quarto giovedì di novembre.

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

  • Ottieni un elenco di quando si celebra il Giorno dell'Indipendenza in tutti i paesi. Di solito, ogni anno è una data fissa e il giorno è rigorosamente osservato in tutte le aree del paese.

    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;
    

Utilizzare il modello di dati delle festività

Ti piacerebbe giocare con questo modello di dati? Fallo. Ecco solo alcune delle domande che abbiamo pensato:

  • Trova le date in cui si celebra la festa del lavoro in vari paesi.
  • Ricevi un elenco di tutte le festività del 2016 in ogni parte del Regno Unito.
  • Fai un elenco di tutti i giorni festivi osservati in Francia nel 2016.
  • Ottieni l'elenco di tutte le festività osservate nella provincia canadese di Manitoba nel 2016.

Come sei riuscito a memorizzare i dettagli delle vacanze nella tua applicazione? Mi piacerebbe sentire le tue idee. Per favore, sentiti libero di condividere la tua esperienza con l'archiviazione di questi metadati e la tua opinione sulla nostra soluzione.