Database
 sql >> Base de données >  >> RDS >> Database

Afficher les jours fériés avec les yeux du modélisateur de données

Fête!! Du temps en famille!! Longue route!! Une journée à la plage!! Tous ces mots bourdonnent dans nos têtes quand on pense aux vacances. Avez-vous déjà pensé à la façon dont une entreprise multinationale assure le suivi des vacances à travers le monde ? Il doit y avoir un dictionnaire de données pour maintenir tous ces détails afin qu'ils puissent assurer des affaires transparentes avec leurs partenaires locaux.

Cet article explique un tel modèle de données.

Les exigences du projet en bref

J'ai des exigences assez simples et directes cette fois. J'ai besoin de créer un dictionnaire de données pour les vacances dans de nombreux pays. Je veux le construire comme un composant qui peut être intégré dans le modèle de données principal quand et où cela est nécessaire.

Sur quelques faits intéressants sur les vacances à travers les pays

En termes d'exigences de projet, il s'agit de l'un des problèmes les plus simples de la modélisation des données. Pourtant, il est déjà assez difficile de concevoir un modèle de données pour cela. Habituellement, les vacances tombent à une date fixe chaque année, mais ce n'est pas le cas pour toutes les vacances dans tous les pays. Si nous analysons les vacances dans différents pays, nous pouvons facilement prévoir les complications liées à la conception de ce modèle de données.

Jetons un coup d'œil à quelques faits intéressants sur les vacances dans différents pays :

  • De nombreuses fêtes, notamment patriotiques, sont observées à date fixe chaque année.

    Exemple :

    Le Jour de l'Indépendance aux États-Unis et en Inde est célébré respectivement le 4 juillet et le 15 août.

  • Certains jours fériés sont célébrés un jour précis chaque année, mais pas toujours à la même date calendaire.

    Exemple :

    Le jour de Thanksgiving aux États-Unis est célébré le 4 jeudi de novembre. L'année dernière (2015), cela tombait le 26 novembre; cette année, ce sera le 24 novembre.

  • Certaines fêtes sont célébrées à une date fixe dans l'année, mais si la date tombe un samedi ou un dimanche, la fête est délibérément décalée au lundi suivant pour observer un long week-end. Un tel jour férié est parfois appelé «lundié» .

    Exemples :

    En Australie et en Nouvelle-Zélande, le jour de l'ANZAC est célébré le 6 février, mais si cette date tombe un samedi ou un dimanche, le jour férié est observé le lundi un jour ou deux plus tard.

    Un autre bon exemple est la fête du travail en Chine. Ce jour férié est également "lundiisé".

  • Les dates de certains jours fériés sont décalées d'une semaine si elles coïncident avec d'autres jours fériés.

    Exemple :

    La Journée de la famille et de la communauté en Australie est célébrée le premier lundi d'octobre, mais si la fête du Travail tombe également le premier lundi, la Journée de la famille est alors décalée au deuxième lundi d'octobre.

  • Tous les jours fériés ne sont pas considérés comme des jours fériés , c'est-à-dire les jours fériés lorsque les banques, les instituts financiers, les marchés boursiers et les bureaux du gouvernement sont fermés. (Aux États-Unis et au Canada, les jours fériés sont appelés jours fériés fédéraux ou légaux.)
  • Les vacances patriotiques sont strictement observées à la même date chaque année. Tous les instituts et bureaux (y compris les banques) de toutes les régions du pays sont fermés ce jour-là. Cependant, dans certains pays, comme les États-Unis et le Canada, si ces jours fériés tombent un week-end, ils seront également observés le lundi suivant, c'est-à-dire que les banques et les bureaux du gouvernement seront fermés ce lundi.
  • Les jours fériés portant le même nom sont observés à des jours différents dans différents pays.

    Exemple :

    La fête du Travail est célébrée le 1er mai en Inde, alors qu'elle est célébrée le premier lundi de septembre au Canada.

  • Certains jours fériés sont traditionnellement regroupés avec des jours de congé non fériés.

    Exemple :

    La fête du Travail en Chine et en Afrique du Sud est célébrée un jour, mais deux autres jours de congé sont inclus.

  • Les autres jours, bien qu'ils ne soient pas techniquement des jours fériés, sont généralement autorisés comme jours non ouvrables.

    Exemple :

    Aux États-Unis, le vendredi après Thanksgiving est officieusement connu sous le nom de Black Friday. Ce n'est pas un jour férié, mais de nombreuses entreprises accordent un jour de congé à leurs employés.

  • Certains jours fériés sont observés différemment dans différentes régions d'un pays.

    Exemple :

    Le jour férié d'été au Royaume-Uni est célébré le premier lundi d'août en Écosse, mais le même jour férié est observé le dernier lundi d'août en Angleterre, à Guernesey, à Jersey, en Irlande du Nord et au Pays de Galles.

  • Certaines fêtes régionales ou locales sont observées dans une seule partie d'un pays. Ceux-ci peuvent être liés à des événements religieux, ethniques ou culturels.

    Exemple :

    La Journée Louis Riel n'est célébrée que dans la province canadienne du Manitoba.

  • Certains jours d'observation pour certains jours fériés sont basés sur une condition "avant" ou "après".

    Exemples :

    • La Journée nationale des patriotes est célébrée dans la province canadienne de Québec le lundi avant le 25 mai.
    • Le jour du repentir en Allemagne est observé le mercredi immédiatement avant 23 novembre.
    • Jeune Genevois en Suisse est observé le jeudi suivant le premier dimanche de septembre.
  • Certains jours de fête sont basés sur des calendriers plus anciens qui ne correspondent pas au calendrier grégorien couramment utilisé. Par conséquent, leurs dates varient chaque année.

    Exemples :

    • Pâques est célébrée le premier dimanche après la pleine lune du 21 mars ou au plus tôt après.
    • Diwali (une ancienne fête hindoue) est célébrée sur plusieurs jours, de la fin du mois lunaire hindou d'Ashvin au début du mois de Kartika. Habituellement, cela tombe quelque part entre la mi-octobre et la mi-novembre dans le calendrier grégorien.
  • Noël orthodoxe :il suit l'ancien calendrier julien. Depuis 2016, il y a une différence de 13 jours entre le calendrier julien et le calendrier grégorien. En conséquence, le Noël orthodoxe tombe le 7 janvier 2016.

Résumer les faits

Il est important de noter que je ne considère que le calendrier grégorien internationalement accepté (qui suit le cycle solaire) pour automatiser la population de données pour les vacances pour les années et les pays. Dans cet article, je ne considère pas les calendriers luni-solaires, hébreux ou hindous (qui suivent le cycle lunaire). Cependant, ces calendriers sont suivis dans des régions spécifiques du globe. Pour l'instant, les jours fériés basés sur ces calendriers peuvent être introduits manuellement dans le système .

Pour résumer, les jours fériés à travers les pays peuvent être classés en fonction de la façon dont leurs dates sont dérivées :

  • Congés fixes – Les jours fériés qui surviennent à date fixe chaque année.
  • Vacances mobiles – Les jours fériés qui tombent un jour précis, comme le premier lundi de février ou le troisième jeudi de novembre.
  • Congés ajustables - Les jours fériés qui relèvent de l'une ou l'autre catégorie, mais qui sont parfois observés d'autres jours pour éviter d'entrer en conflit avec d'autres célébrations (ou en conflit avec le week-end) ou décalés à la semaine suivante en raison d'un conflit avec d'autres jours fériés à la même date.
  • Vacances basées sur d'autres calendriers – Les célébrations de vacances basées sur le calendrier lunaire, orthodoxe ou hindou. Pour l'instant, ceux-ci sont introduits manuellement dans notre modèle.

Nous pouvons en outre classer les vacances en deux catégories en fonction de ils sont observés :

  • Fêtes nationales – Jours fériés observés au niveau national.
  • Fêtes régionales ou locales - Jours fériés observés dans un état ou une région particulière d'un pays.

Dans presque tous les pays, les jours fériés nationaux et régionaux sont considérés comme des jours fériés au niveau national ou régional. Cependant, tous les jours fériés ne sont pas des jours fériés, nous devons donc désigner quels jours fériés sont des jours fériés et lesquels ne le sont pas.

À ce stade, nous devrions également envisager certains scénarios théoriques pour des domaines d'activité spécifiques. Par exemple :

  • Dans certains pays, les banques et autres institutions financières bénéficient d'un jour de congé le premier jour de chaque trimestre.
  • Certaines organisations accordent un jour de congé après la publication de leurs résultats trimestriels.

Nous veillerons à ce que ces points soient également inclus dans la conception de notre modèle de données.

Concevoir un modèle de données de vacances complet

Lors de la conception du modèle de données, j'utiliserai la convention américaine selon laquelle la semaine commence le dimanche. Il ne sera pas trop difficile de changer cela plus tard si nécessaire.

L'ensemble de ce modèle de données s'articulera autour de trois domaines :"Calendrier", "Vacances" et "Pays".

Le domaine "Calendrier"

Dans cette zone, il y a une table principale nommée calendar qui stocke les dates pendant de nombreuses années. Il y aura également des colonnes supplémentaires pour stocker des valeurs numériques pré-calculées, ce qui nous aidera à dériver des dates pour certains jours fériés mobiles. Les colonnes sont les suivantes :

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Il existe deux autres tableaux dans ce domaine :day_of_week et month_of_year .

Comme leurs noms le suggèrent, nous stockerons les détails des jours et des mois individuels dans ces tables. Par conséquent, ils auront toujours 7 et 12 enregistrements respectivement. Certaines choses à garder à l'esprit pour cette section sont :

  • Nous pouvons configurer le début de la semaine au moyen d'une colonne de séquence dans ces deux tableaux. Nous pouvons faire la même chose avec le début de l'année.
  • Les clés primaires des deux tables sont référencées dans le calendar table. Ils stockent des valeurs numériques pour les jours de la semaine et les mois de l'année.
  • La valeur d'une année peut être extraite du calendar_date colonne, mais je garde toujours calendar_year comme une colonne séparée. Cela nous permet de partitionner la table sur cette colonne, ce qui à son tour permet de meilleures performances pour les SQL sous-jacents.
  • La taille des colonnes de nombres a été définie en fonction des valeurs possibles pour la colonne. Par exemple, le day_of_year doit être une valeur comprise entre 1 et 365, donc je définis number(3) comme type de données de la colonne.

Le domaine "Vacances"

Comme nous l'avons déjà dit, il existe deux types de vacances - fixes et mobiles. Nous allons donc créer deux tables différentes, une pour chaque type.

Le holiday_fixed la table utilise day_of_month et month_of_year_id colonnes pour stocker des valeurs numériques pour le jour et le mois. En utilisant ces valeurs, nous pouvons dériver une date pour un jour férié fixe.

Sur des lignes similaires, le holiday_moveable utilisera les colonnes suivantes pour dériver une date pour chaque jour férié mobile :

Le is_bank_holiday la colonne indique si le jour férié est un jour férié, c'est-à-dire que toutes les institutions financières sont fermées ce jour-là. Cette colonne est obligatoire dans les deux tableaux.

Le is_mondayized modifie la date des jours fériés qui tombent un samedi ou un dimanche mais qui sont observés le lundi suivant.

Créons également une autre table, à savoir holiday_miscellaneous , pour stocker les enregistrements des jours fériés basés sur des calendriers non grégoriens. Les enregistrements seront insérés manuellement dans cette table.

Ces trois tables ont une colonne faisant référence à la holiday_category table. Celui-ci contient des données sur la nature des vacances. Il peut y avoir différentes catégories ici, notamment :

  • Public / Jour férié – Les banques sont officiellement fermées et aucune transaction n'a lieu.
  • Fête nationale – Jours fériés au niveau de l'État uniquement.
  • Fête nationale - Généralement un anniversaire patriotique ou un jour défini par la loi qui est célébré dans tout le pays.
  • Fête locale – Déclaré par le gouvernement local et observé dans une région spécifique uniquement.
  • Observation – Les jours fériés qui ne sont pas célébrés à leurs dates réelles, mais un autre jour (souvent le lundi). Permet généralement aux gens d'avoir un week-end de trois jours.

Vous avez dû remarquer le state_id colonne dans les trois tables de vacances. Parlons de la signification de cette colonne dans la section suivante.

Le domaine "Pays"

Nous avons deux tableaux dans ce domaine :

  1. country – qui stocke les noms et identifiants des pays ;
  2. state - qui stocke les noms et identifiants d'état et/ou de région pour chaque pays individuel.

Finalement, nous ferons référence à cet state dans les trois tables de jours fériés pour déterminer à quelle région, état et pays appartient un jour férié.

Étant donné que de nombreux jours fériés sont célébrés au niveau national, il n'est pas logique de conserver des enregistrements au niveau de l'État pour ces jours fériés dans le holiday table. Cela deviendrait extrêmement redondant. Au lieu de cela, nous pouvons avoir un enregistrement dans l'state table avec 'ALL' comme nom d'état. Cet enregistrement peut être mappé avec tous les jours fériés de ce pays, éliminant ainsi la nécessité de conserver d'énormes enregistrements dans le holiday table inutilement.

Le modèle de données de vacances final

Jetons un coup d'œil au modèle de données de vacances complet ici :




Il existe plusieurs façons de jouer avec ce modèle. Par exemple :

  • Obtenez une liste de tous les jours fériés observés dans un pays particulier, par exemple la Pologne.

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

  • Trouvez la date du jour de Thanksgiving en 2018 - N'oubliez pas que cela est célébré dans tous les États des États-Unis le quatrième jeudi de 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’ )
    

  • Obtenez une liste des dates de célébration de la fête de l'indépendance dans tous les pays. Habituellement, c'est à une date fixe chaque année, et le jour est strictement observé dans toutes les régions du pays.

    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;
    

Utilisation du modèle de données de vacances

Aimeriez-vous jouer avec ce modèle de données ? Fonce. Voici quelques-unes des requêtes que nous avons imaginées :

  • Recherchez les dates de la fête du Travail dans différents pays.
  • Obtenez une liste de tous les jours fériés 2016 pour chaque partie du Royaume-Uni.
  • Faire une liste de tous les jours fériés observés en France en 2016.
  • Obtenez la liste de tous les jours fériés observés dans la province canadienne du Manitoba en 2016.

Comment avez-vous réussi à stocker les détails des vacances dans votre application ? J'aimerais entendre vos idées. N'hésitez pas à partager votre expérience avec le stockage de ces métadonnées ainsi que votre point de vue sur notre solution.