Database
 sql >> Baza danych >  >> RDS >> Database

Oglądanie wakacji oczami projektanta danych

Uroczystość!! Czas dla rodziny!! Długa podróż!! Dzień na plaży!! Wszystkie te słowa przychodzą nam do głowy, gdy myślimy o wakacjach. Czy zastanawiałeś się kiedyś, w jaki sposób międzynarodowa firma śledzi święta na całym świecie? Musi istnieć słownik danych, aby zachować wszystkie te szczegóły, aby zapewnić bezproblemową współpracę z lokalnymi partnerami.

W tym artykule wyjaśnimy taki model danych.

Wymagania projektu w skrócie

Tym razem mam dość proste i jednoznaczne wymagania. Muszę zbudować słownik danych na wakacje w wielu krajach. Chcę go zbudować jako komponent, który można zintegrować z głównym modelem danych, kiedy i gdzie jest to wymagane.

O kilku interesujących faktach dotyczących świąt w różnych krajach

Pod względem wymagań projektowych jest to jeden z najprostszych problemów w modelowaniu danych. Jednak wystarczająco trudno jest zaprojektować dla niego model danych. Zazwyczaj święta przypadają w ustalonym dniu każdego roku, ale nie w przypadku każdego święta w każdym kraju. Jeśli przeanalizujemy święta w różnych krajach, możemy łatwo przewidzieć komplikacje związane z projektowaniem tego modelu danych.

Rzućmy okiem na kilka interesujących faktów na temat wakacji w różnych krajach:

  • Wiele świąt, zwłaszcza patriotycznych, obchodzonych jest co roku w ustalonym terminie.

    Przykład:

    Dzień Niepodległości w USA i Indiach obchodzony jest odpowiednio 4 lipca i 15 sierpnia.

  • Niektóre święta obchodzone są w określonym dniu każdego roku – ale nie zawsze w tej samej dacie kalendarzowej.

    Przykład:

    Święto Dziękczynienia w USA obchodzone jest w czwarty czwartek listopada. W zeszłym roku (2015) wypadło to 26 listopada; w tym roku będzie to 24 listopada.

  • Niektóre święta obchodzone są w ustalonym terminie w ciągu roku, ale jeśli data wypada w sobotę lub niedzielę, święto celowo jest przesunięte na następny poniedziałek, aby zachować długi weekend. Takie święto jest czasami nazywane „poniedziałkowym” .

    Przykłady:

    W Australii i Nowej Zelandii Dzień ANZAC obchodzony jest 6 lutego, ale jeśli ta data przypada w sobotę lub niedzielę, święto obchodzone jest w poniedziałek dzień lub dwa później.

    Innym dobrym przykładem jest Święto Pracy w Chinach. To święto jest również „poniedziałkowe”.

  • Daty niektórych świąt są przesunięte o tydzień, jeśli kolidują z innymi świętami.

    Przykład:

    Dzień Rodziny i Społeczności w Australii obchodzony jest w pierwszy poniedziałek października, ale jeśli Święto Pracy przypada również w pierwszy poniedziałek, Dzień Rodziny jest przesunięty na drugi poniedziałek października.

  • Nie wszystkie święta są traktowane jako święta państwowe , czyli święta, kiedy banki, instytucje finansowe, giełdy i urzędy państwowe są zamknięte. (W USA i Kanadzie święta państwowe są znane jako święta federalne lub ustawowe).
  • Święta patriotyczne są ściśle przestrzegane każdego roku w tym samym dniu. Wszystkie instytuty i urzędy (w tym banki) we wszystkich regionach kraju są tego dnia nieczynne. Jednak w niektórych krajach, takich jak USA i Kanada, jeśli te święta przypadają w weekend, będą one również przestrzegane w następny poniedziałek – to znaczy, że banki i urzędy rządowe będą zamknięte w ten poniedziałek.
  • Święta o tej samej nazwie są obchodzone w różne dni w różnych krajach.

    Przykład:

    Święto Pracy obchodzone jest 1 maja w Indiach, podczas gdy w Kanadzie obchodzony jest w pierwszy poniedziałek września.

  • Niektóre dni wolne od pracy są tradycyjnie łączone z dniami wolnymi od pracy.

    Przykład:

    Święto Pracy w Chinach i RPA obchodzone jest jednego dnia, ale wliczone są dwa inne dni wolne.

  • Inne dni, które nie są technicznie świętami, są zwyczajowo dozwolone jako dni wolne od pracy.

    Przykład:

    W USA piątek po Święcie Dziękczynienia jest nieoficjalnie nazywany Czarnym Piątkiem. To nie jest święto państwowe, ale wiele firm daje swoim pracownikom dzień wolny.

  • Niektóre święta są obchodzone w różny sposób w różnych regionach kraju.

    Przykład:

    Letnie święto bankowe w Wielkiej Brytanii obchodzone jest w pierwszy poniedziałek sierpnia w Szkocji, ale to samo święto obchodzone jest w ostatni poniedziałek sierpnia w Anglii, Guernsey, Jersey, Irlandii Północnej i Walii.

  • Niektóre święta regionalne lub lokalne są obchodzone tylko w jednej części kraju. Mogą być one powiązane z wydarzeniami religijnymi, etnicznymi lub kulturowymi.

    Przykład:

    Dzień Louisa Riela obchodzony jest tylko w kanadyjskiej prowincji Manitoba.

  • Niektóre dni obserwacyjne w niektóre święta są oparte na warunkach „przed” lub „po”.

    Przykłady:

    • Narodowy Dzień Patriota obchodzony jest w kanadyjskiej prowincji Quebec w poniedziałek przed 25 maja.
    • Dzień Skruchy w Niemczech obchodzony jest w środę bezpośrednio przed 23 listopada.
    • Jeune Genevois w Szwajcarii jest obserwowany w czwartek po w pierwszą niedzielę września.
  • Niektóre dni świąteczne są oparte na starszych kalendarzach, które nie pasują do powszechnie używanego kalendarza gregoriańskiego. Dlatego ich daty zmieniają się co roku.

    Przykłady:

    • Wielkanoc obchodzona jest w pierwszą niedzielę po pełni księżyca przypadającą 21 marca lub najwcześniej po niej.
    • Diwali (starożytne święto hinduskie) obchodzone jest przez kilka dni, od końca hinduskiego miesiąca księżycowego Aszwin do początku miesiąca Kartika. Zwykle przypada to gdzieś między połową października a połową listopada w kalendarzu gregoriańskim.
  • Ortodoksyjne Święta Bożego Narodzenia – to zgodne ze starszym kalendarzem juliańskim. Od 2016 r. istnieje różnica 13 dni między kalendarzem juliańskim a kalendarzem gregoriańskim. W rezultacie prawosławne Boże Narodzenie przypada 7 stycznia 2016 r.

Podsumowanie faktów

Należy zauważyć, że Rozważam tylko kalendarz gregoriański, który jest akceptowany na całym świecie (który podąża za cyklem słonecznym) do automatyzacji populacji danych dla wakacji na lata i kraje. W tym artykule nie rozważam kalendarza księżycowego, hebrajskiego ani hinduskiego (które następują po cyklu księżycowym). Jednak te kalendarze są śledzone w określonych regionach globu. Na razie święta oparte na tych kalendarzach można wprowadzać do systemu ręcznie .

Podsumowując, święta w różnych krajach można kategoryzować na podstawie sposobu, w jaki pochodzą ich daty:

  • Stałe święta – Święta, które odbywają się w określonym dniu każdego roku.
  • Ruchome święta – Święta, które przypadają w konkretny dzień, np. pierwszy poniedziałek lutego lub trzeci czwartek listopada.
  • Regulowane święta – Święta należące do jednej z kategorii, ale czasami są obserwowane w inne dni, aby uniknąć kolizji z innymi uroczystościami (lub kolidowania z weekendem) lub przesunięte na następny tydzień z powodu kolizji z innymi świętami w tym samym dniu.
  • Święta na podstawie innych kalendarzy – Obrzędy świąteczne oparte na kalendarzu księżycowym, prawosławnym lub hinduskim. Na razie są one ręcznie wprowadzane do naszego modelu.

Możemy dalej podzielić święta na dwie kategorie na podstawie gdzie są obserwowane:

  • Święta narodowe – Święta, które są przestrzegane na poziomie kraju.
  • Święta regionalne lub lokalne – Święta obchodzone w określonym stanie lub regionie kraju.

W prawie wszystkich krajach święta narodowe i regionalne są obchodzone jako święta państwowe na szczeblu krajowym lub regionalnym. Jednak nie wszystkie święta są dniami wolnymi od pracy, więc powinniśmy określić, które dni świąteczne są, a które nie.

W tym miejscu powinniśmy również rozważyć kilka teoretycznych scenariuszy dla konkretnych obszarów biznesowych. Na przykład:

  • W niektórych krajach banki i inne instytucje finansowe otrzymują dzień wolny pierwszego dnia każdego kwartału.
  • Niektóre organizacje dają dzień wolny po opublikowaniu wyników kwartalnych.

Upewnimy się, że te punkty są również uwzględnione w naszym projekcie modelu danych.

Projektowanie kompleksowego modelu danych świątecznych

Projektując model danych będę się posługiwał konwencją amerykańską, że tydzień zaczyna się w niedzielę. W razie potrzeby zmiana tego nie będzie zbyt trudna.

Cały ten model danych będzie się obracał wokół trzech obszarów tematycznych:„Kalendarz”, „Wakacje” i „Kraj”.

Obszar tematyczny „Kalendarz”

W tym obszarze znajduje się główna tabela o nazwie calendar przechowuje daty przez wiele lat. Pojawią się również dodatkowe kolumny do przechowywania wstępnie obliczonych wartości liczbowych, które pomogą nam wyznaczyć daty niektórych ruchomych świąt. Kolumny są następujące:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

W tym obszarze tematycznym są jeszcze dwie tabele:day_of_week i month_of_year .

Jak sugerują ich nazwy, w tych tabelach będziemy przechowywać szczegóły dotyczące poszczególnych dni i miesięcy. Dlatego zawsze będą miały odpowiednio 7 i 12 rekordów. W tej sekcji należy pamiętać o następujących kwestiach:

  • Możemy skonfigurować początek tygodnia za pomocą kolumny sekwencji w obu tych tabelach. Możemy zrobić to samo z początkiem roku.
  • Klucze podstawowe obu tabel znajdują się w calendar stół. Przechowują wartości liczbowe dla dni tygodnia i miesięcy w roku.
  • Wartość roku można pobrać z calendar_date kolumna, ale nadal zachowuję calendar_year jako oddzielna kolumna. To pozwala nam podzielić tabelę na partycje w tej kolumnie, co z kolei zapewnia lepszą wydajność bazowych SQL.
  • Rozmiar kolumn liczbowych został zdefiniowany na podstawie możliwych wartości dla kolumny. Na przykład day_of_year musi być jakąś wartością z przedziału od 1 do 365, więc jako typ danych kolumny określam number(3).

Obszar tematyczny „Wakacje”

Jak powiedzieliśmy wcześniej, istnieją dwa rodzaje świąt – stałe i ruchome. Dlatego stworzymy dwie różne tabele, po jednej dla każdego typu.

holiday_fixed tabela używa day_of_month i month_of_year_id kolumny do przechowywania wartości liczbowych dla dnia i miesiąca. Korzystając z tych wartości, możemy wyznaczyć datę stałego święta.

W podobnych wierszach holiday_moveable tabela użyje następujących kolumn, aby uzyskać datę każdego ruchomego święta:

is_bank_holiday kolumna wskazuje, czy dzień wolny od pracy jest dniem wolnym od pracy, tj. wszystkie instytucje finansowe są tego dnia zamknięte. Ta kolumna jest wymagana w obu tabelach.

is_mondayized kolumna modyfikuje datę świąt, które przypadają w sobotę lub niedzielę, ale są obchodzone w następny poniedziałek.

Stwórzmy również inną tabelę, a mianowicie holiday_miscellaneous , aby przechowywać rekordy dotyczące świąt w oparciu o kalendarze inne niż gregoriańskie. Rekordy zostaną wstawione do tej tabeli ręcznie.

Wszystkie te trzy tabele mają jedną kolumnę odwołującą się do holiday_category stół. Zawiera dane o charakterze święta. W tym miejscu mogą znajdować się różne kategorie, w tym:

  • Święto publiczne/bankowe – Banki są oficjalnie zamknięte i nie ma handlu.
  • Święto państwowe – Święta państwowe tylko na poziomie stanowym.
  • Święto narodowe – Na ogół rocznica patriotyczna lub dzień prawnie obchodzony w całym kraju.
  • Lokalne święta – Deklarowane przez władze lokalne i obserwowane tylko w określonym regionie.
  • Przestrzeganie – Święta, które nie są obchodzone w ich rzeczywistych terminach, ale w inny dzień (często poniedziałek). Zwykle pozwala ludziom na trzydniowy weekend.

Musiałeś zauważyć state_id kolumna we wszystkich trzech tabelach świątecznych. Porozmawiajmy o znaczeniu tej kolumny w następnej sekcji.

Obszar tematyczny „Kraj”

Mamy dwie tabele w tym obszarze tematycznym:

  1. country – który przechowuje nazwy i identyfikatory krajów;
  2. state – który przechowuje nazwy i identyfikatory stanów i/lub regionów dla każdego kraju.

Ostatecznie odniesiemy się do tego state tabeli we wszystkich trzech tabelach świątecznych, aby określić, do którego regionu, stanu i kraju należy święto.

Ponieważ wiele świąt obchodzonych jest na poziomie kraju, nie ma sensu prowadzenie rejestrów na poziomie stanu dla takich świąt w holiday stół. To stałoby się niezwykle zbędne. Zamiast tego możemy mieć jeden rekord w stanie state tabela z „ALL” jako nazwą stanu. Ten rekord może być mapowany ze wszystkimi świętami w tym kraju, eliminując w ten sposób potrzebę przechowywania ogromnych rekordów w holiday tabeli niepotrzebnie.

Ostateczny model danych świątecznych

Przyjrzyjmy się tutaj kompletnemu modelowi danych świątecznych:




Istnieje kilka sposobów na zabawę tym modelem. Na przykład:

  • Uzyskaj listę wszystkich świąt obserwowanych w danym kraju, na przykład w Polsce.

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

  • Znajdź datę Święta Dziękczynienia w 2018 r. – Pamiętaj, że obchodzony jest we wszystkich stanach USA w czwarty czwartek listopada.

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

  • Pobierz listę obchodów Święta Niepodległości we wszystkich krajach. Zwykle odbywa się to w ustalonym dniu każdego roku, a dzień ten jest ściśle przestrzegany we wszystkich częściach kraju.

    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;
    

Wykorzystywanie modelu danych świątecznych

Czy chciałbyś poeksperymentować z tym modelem danych? Idź po to. Oto tylko niektóre z zapytań, które wymyśliliśmy:

  • Znajdź daty obchodów Święta Pracy w różnych krajach.
  • Uzyskaj listę wszystkich świąt 2016 r. dla każdej części Wielkiej Brytanii.
  • Zrób listę wszystkich świąt państwowych zaobserwowanych we Francji w 2016 r.
  • Pobierz listę wszystkich świąt obserwowanych w kanadyjskiej prowincji Manitoba w 2016 r.

Jak udało Ci się przechowywać w swojej aplikacji informacje o urlopach? Chciałbym usłyszeć twoje pomysły. Zachęcamy do podzielenia się swoimi doświadczeniami z przechowywaniem tych metadanych, a także swoim zdaniem na temat naszego rozwiązania.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Operatory SET w SQL

  2. Jak stworzyć bazę danych w SQL?

  3. SQL INSERT INTO… SELECT Przykłady

  4. Co to jest AWS RDS

  5. Jak przekonwertować ciąg na małe litery w SQL?