sql >> Base de Datos >  >> RDS >> Database

Visualización de días festivos con los ojos del modelador de datos

¡¡Celebracion!! ¡¡Tiempo familiar!! ¡¡Viaje largo!! ¡¡Un día en la playa!! Todas estas palabras zumban en nuestra mente cuando pensamos en vacaciones. ¿Alguna vez ha considerado cómo una empresa multinacional realiza un seguimiento de las vacaciones en todo el mundo? Debe haber un diccionario de datos para mantener todos estos detalles para que puedan garantizar negocios sin problemas con sus socios locales.

Este artículo explicará dicho modelo de datos.

Los requisitos del proyecto en pocas palabras

Tengo requisitos bastante simples y directos esta vez. Necesito crear un diccionario de datos para vacaciones en muchos países. Quiero construirlo como un componente que pueda integrarse en el modelo de datos principal cuando y donde sea necesario.

Sobre algunos datos interesantes sobre las vacaciones en todos los países

En términos de los requisitos del proyecto, este es uno de los problemas más simples en el modelado de datos. Sin embargo, ya es bastante difícil diseñar un modelo de datos para ello. Por lo general, los días festivos caen en una fecha fija todos los años, pero este no es el caso para todos los días festivos en todos los países. Si analizamos las vacaciones en varios países, podemos prever fácilmente las complicaciones involucradas en el diseño de este modelo de datos.

Echemos un vistazo a algunos datos interesantes sobre las vacaciones en varios países:

  • Muchos días festivos, especialmente los patrióticos, se observan en una fecha fija todos los años.

    Ejemplo:

    El Día de la Independencia en los EE. UU. y la India se celebra el 4 de julio y el 15 de agosto, respectivamente.

  • Algunos días festivos se celebran en un día específico cada año, pero no siempre en la misma fecha del calendario.

    Ejemplo:

    El día de Acción de Gracias en los Estados Unidos se celebra el 4 jueves de noviembre. El año pasado (2015) este cayó el 26 de noviembre; este año será el 24 de noviembre.

  • Algunos días festivos se celebran en una fecha fija en un año, pero si la fecha cae en sábado o domingo, el día festivo se traslada deliberadamente al lunes siguiente para observar un fin de semana largo. Este tipo de vacaciones a veces se llama 'Mondayized' .

    Ejemplos:

    En Australia y Nueva Zelanda, el Día de ANZAC se celebra el 6 de febrero, pero si esa fecha cae en sábado o domingo, el feriado se celebra el lunes uno o dos días después.

    Otro buen ejemplo es el Día del Trabajo en China. Este feriado también es 'lunes'.

  • Las fechas de algunos días festivos se desplazan una semana si coinciden con algún otro día festivo.

    Ejemplo:

    El Día de la Familia y la Comunidad en Australia se celebra el primer lunes de octubre, pero si el Día del Trabajo también cae el primer lunes, el Día de la Familia se cambia al segundo lunes de octubre.

  • No todos los días festivos se observan como días festivos , es decir, días festivos cuando los bancos, institutos financieros, mercados de valores y oficinas gubernamentales están cerrados. (En los EE. UU. y Canadá, los feriados bancarios se conocen como feriados federales o legales).
  • Los días festivos patrióticos se observan estrictamente en la misma fecha todos los años. Todos los institutos y oficinas (incluidos los bancos) en todas las regiones del país están cerrados ese día. Sin embargo, en algunos países, como EE. UU. y Canadá, si estos días festivos caen en fin de semana, también se observarán el lunes siguiente, es decir, los bancos y las oficinas gubernamentales estarán cerrados ese lunes.
  • Los días festivos con el mismo nombre se observan en diferentes días en diferentes países.

    Ejemplo:

    El Día del Trabajo se celebra el 1 de mayo en India, mientras que se celebra el primer lunes de septiembre en Canadá.

  • Algunos días libres festivos se agrupan tradicionalmente con días libres no festivos.

    Ejemplo:

    El Día del Trabajo en China y Sudáfrica se observa en un día, pero se incluyen otros dos días libres.

  • Otros días, aunque técnicamente no son feriados, se permiten normalmente como días no laborables.

    Ejemplo:

    En los EE. UU., el viernes posterior al Día de Acción de Gracias se conoce extraoficialmente como Black Friday. No es un feriado oficial, pero muchas empresas dan a sus empleados el día libre.

  • Algunos días festivos se observan de manera diferente en diferentes regiones dentro de un país.

    Ejemplo:

    El feriado bancario de verano en el Reino Unido se celebra el primer lunes de agosto en Escocia, pero el mismo feriado se observa el último lunes de agosto en Inglaterra, Guernsey, Jersey, Irlanda del Norte y Gales.

  • Ciertos días festivos regionales o locales se observan en una sola parte de un país. Estos pueden estar vinculados a eventos religiosos, étnicos o culturales.

    Ejemplo:

    El Día de Louis Riel se celebra solo en la provincia canadiense de Manitoba.

  • Algunos días de observancia para ciertos días festivos se basan en una condición de "antes" o "después".

    Ejemplos:

    • El Día Nacional del Patriota se celebra en la provincia canadiense de Quebec el lunes anterior el 25 de mayo.
    • El Día del Arrepentimiento en Alemania se observa el miércoles inmediatamente anterior 23 de noviembre.
    • Jeune Genevois en Suiza se observa el jueves siguiente el primer domingo de septiembre.
  • Ciertos días de celebración de días festivos se basan en calendarios más antiguos que no coinciden con el calendario gregoriano de uso común. Por lo tanto, sus fechas varían cada año.

    Ejemplos:

    • La Pascua se celebra el primer domingo después de la luna llena que ocurre el 21 de marzo o lo antes posible después.
    • Diwali (un antiguo festival hindú) se celebra durante varios días, desde el final del mes lunar hindú de Ashvin hasta el comienzo del mes de Kartika. Por lo general, esto cae entre mediados de octubre y mediados de noviembre en el calendario gregoriano.
  • Navidad ortodoxa:sigue el antiguo calendario juliano. A partir de 2016, hay una diferencia de 13 días entre el calendario juliano y el calendario gregoriano. Como resultado, la Navidad ortodoxa cae el 7 de enero de 2016.

Resumir los hechos

Es importante tener en cuenta que solo estoy considerando el calendario gregoriano aceptado internacionalmente (que sigue el ciclo solar) para automatizar la población de datos de vacaciones por años y países. En este artículo, no estoy considerando los calendarios lunisolar, hebreo o hindú (que siguen el ciclo lunar). Sin embargo, estos calendarios se siguen en regiones específicas del mundo. Por ahora, las vacaciones basadas en estos calendarios se pueden introducir en el sistema manualmente .

En resumen, los días festivos de los países se pueden clasificar en función de cómo se derivan sus fechas:

  • Días festivos fijos – Días festivos que ocurren en una fecha fija cada año.
  • Vacaciones móviles – Días festivos que caen en un día específico, como el primer lunes de febrero o el tercer jueves de noviembre.
  • Vacaciones ajustables – Días festivos que pertenecen a cualquiera de las dos categorías, pero que a veces se observan en otros días para evitar que coincidan con otras celebraciones (o que coincidan con el fin de semana) o se cambian a la semana siguiente debido a que coinciden con otros días festivos en la misma fecha.
  • Festivos basados ​​en otros calendarios – Celebraciones de días festivos que se basan en el calendario lunar, ortodoxo o hindú. Por ahora, estos se introducen manualmente en nuestro modelo.

Además, podemos clasificar las vacaciones en dos categorías según dónde se observan:

  • Fiestas Patrias – Días festivos que se observan a nivel de país.
  • Días festivos regionales o locales – Días festivos que se observan en un estado o región particular de un país.

En casi todos los países, los feriados nacionales y regionales se observan como feriados bancarios a nivel nacional o regional. Sin embargo, no todos los días festivos son feriados bancarios, por lo que debemos designar qué días festivos son feriados bancarios y cuáles no.

En este punto, también debemos considerar algunos escenarios teóricos para áreas comerciales específicas. Por ejemplo:

  • En algunos países, los bancos y otras instituciones financieras tienen un día libre el primer día de cada trimestre.
  • Algunas organizaciones dan un día libre después de publicar sus resultados trimestrales.

Nos aseguraremos de que estos puntos también se incluyan en el diseño de nuestro modelo de datos.

Diseño de un modelo integral de datos de vacaciones

Al diseñar el modelo de datos, usaré la convención estadounidense de que la semana comienza el domingo. No será demasiado difícil cambiar esto más tarde si es necesario.

Todo este modelo de datos girará en torno a tres áreas temáticas:"Calendario", "Vacaciones" y "País".

El área temática "Calendario"

En esta área, hay una tabla principal llamada calendar que almacena fechas durante muchos años. También habrá algunas columnas adicionales para almacenar valores numéricos precalculados, lo que nos ayudará a derivar fechas para ciertos días festivos móviles. Las columnas son las siguientes:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Hay dos tablas más en esta área temática:day_of_week y month_of_year .

Como sugieren sus nombres, almacenaremos detalles de días y meses individuales en estas tablas. Por lo tanto, siempre tendrán 7 y 12 registros respectivamente. Algunas cosas a tener en cuenta para esta sección son:

  • Podemos configurar el inicio de la semana mediante una columna de secuencia en ambas tablas. Podemos hacer lo mismo con el comienzo del año.
  • Las claves primarias de ambas tablas están referenciadas en el calendar mesa. Almacenan valores numéricos para los días de la semana y los meses del año.
  • El valor de un año se puede extraer del calendar_date columna, pero sigo manteniendo calendar_year como una columna separada. Esto nos permite dividir la tabla en esta columna, lo que a su vez permite un mejor rendimiento para los SQL subyacentes.
  • El tamaño de las columnas de números se ha definido en función de los posibles valores de la columna. Por ejemplo, el day_of_year debe haber algún valor entre 1 y 365, por lo que defino el número (3) como el tipo de datos de la columna.

El área temática "Vacaciones"

Como dijimos antes, hay dos tipos de vacaciones:fijas y móviles. Entonces crearemos dos tablas diferentes, una para cada tipo.

Las holiday_fixed la tabla usa day_of_month y month_of_year_id columnas para almacenar valores numéricos para el día y el mes. Usando estos valores, podemos derivar una fecha para un feriado fijo.

De manera similar, el holiday_moveable la tabla usará las siguientes columnas para derivar una fecha para cada feriado móvil:

El is_bank_holiday La columna indica si el feriado es un feriado bancario, es decir, todas las instituciones financieras están cerradas ese día. Esta columna es obligatoria en ambas tablas.

El is_mondayized columna modifica la fecha de los días festivos que caen en sábado o domingo pero se observan el lunes siguiente.

También vamos a crear otra tabla, a saber holiday_miscellaneous , para almacenar registros de días festivos basados ​​en calendarios no gregorianos. Los registros se insertarán en esta tabla manualmente.

Estas tres tablas tienen una columna que hace referencia a la holiday_category mesa. Esto contiene datos sobre la naturaleza de las vacaciones. Puede haber varias categorías aquí, incluyendo:

  • Festivo público/banco – Los bancos están oficialmente cerrados y no se realizan transacciones.
  • Festivo estatal – Días festivos a nivel estatal únicamente.
  • Fiesta Nacional – Generalmente un aniversario patrio o un día definido por ley que se celebra a nivel nacional.
  • Fiesta local – Declarado por el gobierno local y observado solo en una región específica.
  • Cumplimiento – Días festivos que no se celebran en sus fechas reales, sino en algún otro día (frecuentemente lunes). Por lo general, permite que las personas tengan un fin de semana de tres días.

Debes haber notado el state_id columna en las tres tablas de vacaciones. Hablemos sobre el significado de esta columna en la siguiente sección.

El área temática "País"

Tenemos dos tablas en esta área temática:

  1. country – que almacena nombres de países e identificaciones;
  2. state – que almacena nombres de estados y/o regiones e identificaciones para cada país individual.

Eventualmente, nos referiremos a este state en las tres tablas de días festivos para determinar a qué región, estado y país pertenece un día festivo.

Dado que muchos días festivos se celebran a nivel de país, no tiene sentido mantener registros a nivel estatal para dichos días festivos en el holiday mesa. Eso se volvería extremadamente redundante. En su lugar, podemos tener un registro en el state tabla con 'TODOS' como nombre de estado. Este registro se puede mapear con todos los días festivos de ese país, eliminando así la necesidad de mantener grandes registros en el holiday mesa innecesariamente.

El modelo final de datos de vacaciones

Echemos un vistazo al modelo completo de datos de vacaciones aquí:




Hay varias formas en las que podemos jugar con este modelo. Por ejemplo:

  • Obtenga una lista de todos los días festivos observados en un país en particular, digamos 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’)
    ;
    

  • Encuentre la fecha del Día de Acción de Gracias en 2018:recuerde que se celebra en todos los estados de EE. UU. el cuarto jueves de noviembre.

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

  • Obtenga una lista de cuándo se celebra el Día de la Independencia en todos los países. Por lo general, esto es en una fecha fija todos los años, y el día se observa estrictamente en todas las áreas del país.

    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;
    

Poner en uso el modelo de datos de vacaciones

¿Te gustaría jugar con este modelo de datos? Ve a por ello. Estas son solo algunas de las consultas que se nos ocurrieron:

  • Encuentre las fechas en que se observa el Día del Trabajo en varios países.
  • Obtenga una lista de todos los días festivos de 2016 para cada parte del Reino Unido.
  • Haga una lista de todos los días festivos observados en Francia en 2016.
  • Obtenga la lista de todos los días festivos observados en la provincia canadiense de Manitoba en 2016.

¿Cómo logró almacenar los detalles de las vacaciones en su aplicación? Me encantaria escuchar tus ideas. No dude en compartir su experiencia con el almacenamiento de estos metadatos, así como su opinión sobre nuestra solución.