sql >> Databáze >  >> RDS >> Database

Prohlížení prázdnin očima datového modeláře

Oslava!! Čas s rodinou!! Dlouhá jízda!! Den na pláži!! Všechna tato slova nám bzučí v mysli, když myslíme na svátky. Přemýšleli jste někdy o tom, jak nadnárodní společnost sleduje svátky po celém světě? Musí existovat datový slovník, který bude udržovat všechny tyto podrobnosti, aby mohli zajistit bezproblémový obchod se svými místními partnery.

Tento článek vysvětlí takový datový model.

Požadavky projektu v kostce

Tentokrát mám celkem jednoduché a přímočaré požadavky. Potřebuji vytvořit datový slovník pro dovolené v mnoha zemích. Chci jej postavit jako komponentu, kterou lze integrovat do hlavního datového modelu, kdykoli a kdekoli to bude potřeba.

Některá zajímavá fakta o dovolené v různých zemích

Z hlediska projektových požadavků se jedná o jeden z nejjednodušších problémů datového modelování. Navrhnout pro to datový model je však dost těžké. Svátky obvykle každý rok připadají na pevné datum, ale není tomu tak u všech svátků v každé zemi. Pokud analyzujeme dovolené v různých zemích, můžeme snadno předvídat komplikace spojené s tímto návrhem datového modelu.

Pojďme se podívat na některá zajímavá fakta o dovolené v různých zemích:

  • Mnoho svátků, zejména vlasteneckých, se každoročně slaví v pevné datum.

    Příklad:

    Den nezávislosti se v USA a Indii slaví 4. července a 15. srpna.

  • Některé svátky se slaví každý rok v určitý den – ale ne vždy ve stejné kalendářní datum.

    Příklad:

    Den díkůvzdání se v USA slaví 4. čtvrtek v listopadu. Loni (2015) to připadlo na 26. listopadu; letos to bude 24. listopadu.

  • Některé svátky se slaví v pevné datum v roce, ale pokud datum připadne na sobotu nebo neděli, je svátek záměrně posunut na následující pondělí, aby byl zachován prodloužený víkend. Takový svátek se někdy nazývá ‚pondělí‘ .

    Příklady:

    V Austrálii a na Novém Zélandu se ANZAC Day slaví 6. února, ale pokud by toto datum připadlo na sobotu nebo neděli, svátek se slaví v pondělí o den nebo dva později.

    Dalším dobrým příkladem je Svátek práce v Číně. Tento svátek je také ‚pondělní‘.

  • Data některých svátků jsou posunuta o týden, pokud kolidují s nějakým jiným svátkem.

    Příklad:

    Den rodiny a komunity se v Austrálii slaví první pondělí v říjnu, ale pokud Den práce připadne také na první pondělí, přesune se Den rodiny na druhé pondělí v říjnu.

  • Ne všechny svátky jsou považovány za bankovní svátky , tedy svátky, kdy jsou banky, finanční instituce, burzy a státní úřady zavřené. (V USA a Kanadě jsou státní svátky známé jako federální nebo statutární svátky.)
  • Vlastenecké svátky jsou přísně dodržovány každý rok ve stejné datum. Všechny ústavy a úřady (včetně bank) ve všech regionech země jsou toho dne uzavřeny. Pokud však v některých zemích, jako jsou USA a Kanada, připadnou tyto svátky na víkend, budou se dodržovat i následující pondělí – to znamená, že v toto pondělí budou banky a vládní úřady zavřené.
  • Svátky se stejným názvem se v různých zemích slaví v různé dny.

    Příklad:

    Svátek práce se v Indii slaví 1. května, zatímco v Kanadě se slaví první pondělí v září.

  • Některé dny volna o svátcích jsou tradičně spojeny s dny volna mimo prázdniny.

    Příklad:

    Svátek práce v Číně a Jižní Africe se slaví jeden den, ale jsou zahrnuty i další dva dny volna.

  • Ostatní dny, i když se technicky nejedná o svátky, jsou obvykle povoleny jako dny pracovního klidu.

    Příklad:

    V USA je pátek po Dni díkůvzdání neoficiálně známý jako Black Friday. Není to státní svátek, ale mnoho společností dává svým zaměstnancům den volna.

  • Některé svátky jsou v různých regionech v rámci země rozdílné.

    Příklad:

    Summer Bank Holiday ve Spojeném království se slaví první pondělí v srpnu ve Skotsku, ale stejný svátek se slaví poslední pondělí v srpnu v Anglii, Guernsey, Jersey, Severním Irsku a Walesu.

  • Některé regionální nebo místní svátky se dodržují pouze v jedné části země. Ty mohou být spojeny s náboženskými, etnickými nebo kulturními událostmi.

    Příklad:

    Den Louise Riela se slaví pouze v kanadské provincii Manitoba.

  • Některé dny dodržování určitých svátků jsou založeny na podmínce „před“ nebo „po“.

    Příklady:

    • V kanadské provincii Quebec se v pondělí před slaví Den národního patriotů 25. května.
    • Den pokání se v Německu slaví ve středu bezprostředně před 23. listopadu.
    • Jeune Genevois ve Švýcarsku se koná ve čtvrtek následující první neděli v září.
  • Některé sváteční dny jsou založeny na starších kalendářích, které neodpovídají běžně používanému gregoriánskému kalendáři. Proto se jejich data každý rok liší.

    Příklady:

    • Velikonoce se slaví první neděli po úplňku, který nastává 21. března nebo nejdříve po něm.
    • Diwali (starověký hinduistický svátek) se slaví několik dní, od konce hinduistického lunárního měsíce Ašvin do začátku měsíce Kartika. Obvykle to v gregoriánském kalendáři spadá někde mezi polovinou října a polovinou listopadu.
  • Pravoslavné Vánoce – následují podle staršího juliánského kalendáře. Od roku 2016 je mezi juliánským a gregoriánským kalendářem rozdíl 13 dní. V důsledku toho připadají pravoslavné Vánoce na 7. ledna 2016.

Shrnutí faktů

Je důležité poznamenat, že Zvažuji pouze mezinárodně uznávaný gregoriánský kalendář (který následuje po slunečním cyklu) pro automatizaci datové populace pro svátky pro roky a země. V tomto článku neuvažuji lunisolární, hebrejský ani hinduistický kalendář (které následují po lunárním cyklu). Tyto kalendáře jsou však dodržovány v určitých oblastech světa. Prozatím lze svátky založené na těchto kalendářích vkládat do systému ručně .

Stručně řečeno, svátky v různých zemích lze kategorizovat podle toho, jak jsou odvozeny jejich data:

  • Pevné svátky – Svátky, které se každý rok konají v pevné datum.
  • Pohyblivé svátky – Svátky, které připadají na konkrétní den, například první pondělí v únoru nebo třetí čtvrtek v listopadu.
  • Nastavitelné svátky – Svátky, které spadají do jedné z kategorií, ale někdy jsou dodržovány v jiné dny, aby nedošlo ke střetu s jinými oslavami (nebo ke střetu s víkendem) nebo posunuty na další týden kvůli střetu s jiným svátkem ve stejný den.
  • Svátky podle jiných kalendářů – Svátky, které jsou založeny na lunárním, ortodoxním nebo hinduistickém kalendáři. Prozatím jsou do našeho modelu vkládány ručně.

Dovolenou můžeme dále rozdělit do dvou kategorií podle toho, kde jsou dodržovány:

  • Státní svátky – svátky, které se dodržují na úrovni země.
  • Regionální nebo místní svátky – Svátky, které se konají v určitém státě nebo regionu země.

Téměř ve všech zemích jsou národní a regionální svátky dodržovány jako státní svátky na národní nebo regionální úrovni. Ne všechny svátky jsou však svátky, takže bychom měli určit, které svátky jsou a které ne.

V tomto bodě bychom také měli zvážit některé teoretické scénáře pro konkrétní oblasti podnikání. Například:

  • V některých zemích mají banky a další finanční instituce první den každého čtvrtletí volno.
  • Některé organizace dávají po zveřejnění svých čtvrtletních výsledků den volna.

Zajistíme, aby tyto body byly také zahrnuty do našeho návrhu datového modelu.

Návrh komplexního datového modelu dovolené

Při navrhování datového modelu použiji americkou konvenci, že týden začíná v neděli. Nebude příliš obtížné to později v případě potřeby změnit.

Celý tento datový model se bude točit kolem tří tematických oblastí:„Kalendář“, „Dovolená“ a „Země“.

Věcná oblast „Kalendář“

V této oblasti se nachází hlavní tabulka s názvem calendar která uchovává data po mnoho let. Budou zde také některé další sloupce pro uložení předem vypočítaných číselných hodnot, které nám pomohou odvodit data pro určité pohyblivé svátky. Sloupce jsou následující:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

V této oblasti jsou další dvě tabulky:day_of_week a month_of_year .

Jak jejich názvy napovídají, do těchto tabulek budeme ukládat podrobnosti o jednotlivých dnech a měsících. Proto budou mít vždy 7 respektive 12 záznamů. V této sekci je třeba mít na paměti:

  • Začátek týdne můžeme nakonfigurovat pomocí sloupce sekvence v obou těchto tabulkách. Totéž můžeme udělat se začátkem roku.
  • Primární klíče obou tabulek jsou uvedeny v calendar stůl. Ukládají číselné hodnoty pro dny v týdnu a měsíce v roce.
  • Hodnotu roku lze získat z calendar_date sloupec, ale stále ponechávám calendar_year jako samostatný sloupec. To nám umožňuje rozdělit tabulku na tento sloupec, což zase umožňuje lepší výkon pro podkladové SQL.
  • Velikost číselných sloupců byla definována na základě možných hodnot pro daný sloupec. Například day_of_year musí být nějaká hodnota mezi 1 a 365, takže jako datový typ sloupce definuji number(3).

Téma „Dovolená“

Jak jsme již řekli, existují dva typy svátků – pevné a pohyblivé. Vytvoříme tedy dvě různé tabulky, jednu pro každý typ.

holiday_fixed tabulka používá day_of_month a month_of_year_id sloupce pro uložení číselných hodnot pro den a měsíc. Pomocí těchto hodnot můžeme odvodit datum pro pevnou dovolenou.

Na podobných linkách je holiday_moveable tabulka použije následující sloupce k odvození data pro každý pohyblivý svátek:

is_bank_holiday sloupec označuje, zda je svátek státním svátkem, to znamená, že všechny finanční instituce jsou v daný den zavřené. Tento sloupec je povinný v obou tabulkách.

is_mondayized sloupec upravuje datum pro svátky, které připadají na sobotu nebo neděli, ale připadají na následující pondělí.

Vytvořme také další tabulku, konkrétně holiday_miscellaneous , k ukládání záznamů o svátcích na základě negregoriánských kalendářů. Záznamy budou do této tabulky vloženy ručně.

Všechny tyto tři tabulky mají jeden sloupec odkazující na holiday_category stůl. To obsahuje údaje o povaze dovolené. Mohou zde být různé kategorie, včetně:

  • Veřejnost / státní svátek – Banky jsou oficiálně uzavřeny a neprobíhá žádné obchodování.
  • Státní svátek – Státní svátky na úrovni státu.
  • Státní svátek – Obecně vlastenecké výročí nebo den definovaný zákonem, který se slaví celostátně.
  • Místní dovolená – Deklarováno místní správou a pozorováno pouze v určité oblasti.
  • Dodržování – Svátky, které se neslaví v jejich skutečný den, ale v jiný den (často pondělí). Obvykle lidem umožňuje mít třídenní víkend.

Určitě jste si všimli state_id sloupec ve všech třech svátečních tabulkách. Promluvme si o významu tohoto sloupce v další části.

Věcná oblast Země

V této oblasti máme dvě tabulky:

  1. country – která ukládá názvy zemí a ID;
  2. state – která ukládá názvy států a/nebo regionů a ID pro každou jednotlivou zemi.

Nakonec se budeme odvolávat na tento state tabulky ve všech třech tabulkách svátků, abyste určili, do kterého regionu, státu a země svátek patří.

Vzhledem k tomu, že mnoho svátků se slaví na úrovni jednotlivých zemí, nemá smysl vést státní záznamy o těchto svátcích v holiday stůl. To by se stalo extrémně nadbytečným. Místo toho můžeme mít jeden záznam ve state tabulka s ‚ALL‘ jako názvem stavu. Tento záznam lze zmapovat se všemi svátky v dané zemi, čímž odpadá nutnost vést velké záznamy o holiday tabulky zbytečně.

Datový model poslední dovolené

Podívejme se na kompletní prázdninový datový model zde:




S tímto modelem si můžeme pohrát několika způsoby. Například:

  • Získejte seznam všech svátků v konkrétní zemi, řekněme v Polsku.

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

  • Najděte datum Dne díkůvzdání v roce 2018 – Nezapomeňte, že se ve všech státech USA slaví čtvrtý čtvrtek v listopadu.

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

  • Získejte seznam, kdy se ve všech zemích slaví Den nezávislosti. Obvykle je to každý rok v pevné datum a tento den je přísně dodržován ve všech oblastech země.

    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;
    

Použití datového modelu dovolené

Chtěli byste si s tímto datovým modelem pohrát? Jít na to. Zde jsou jen některé z dotazů, které jsme vymysleli:

  • Najděte data, kdy se v různých zemích slaví svátek práce.
  • Získejte seznam všech svátků 2016 pro každou část Spojeného království.
  • Udělejte si seznam všech státních svátků ve Francii v roce 2016.
  • Získejte seznam všech svátků zaznamenaných v kanadské provincii Manitoba v roce 2016.

Jak se vám podařilo uložit detaily dovolené do vaší aplikace? Rád bych slyšel vaše nápady. Neváhejte se prosím podělit o své zkušenosti s ukládáním těchto metadat a také o svůj názor na naše řešení.


  1. Chybějící indexy v MS SQL nebo optimalizace v žádném okamžiku

  2. Zkontrolujte, zda je aktuální datum mezi dvěma daty Oracle SQL

  3. Připojení F# k Salesforce.com

  4. ORA-00903:neplatný název tabulky na PreparedStatement