sql >> データベース >  >> RDS >> Database

データモデラーの目で休日を表示する

    お祝い!!家族の時間!!長いドライブ!!ビーチでの一日!私たちが休日について考えるとき、これらの言葉はすべて私たちの心に響き渡ります。多国籍企業が世界中の休日を追跡する方法を考えたことはありますか?ローカルパートナーとのシームレスなビジネスを確保できるように、これらすべての詳細を維持するためのデータディクショナリが必要です。

    この記事では、そのようなデータモデルについて説明します。

    一言で言えばプロジェクト要件

    今回は非常にシンプルでわかりやすい要件があります。多くの国で休日のデータディクショナリを作成する必要があります。必要なときに必要な場所でメインデータモデルに統合できるコンポーネントとして構築したいと思います。

    国を超えた休日に関するいくつかの興味深い事実について

    プロジェクト要件の観点から、これはデータモデリングにおける最も単純な問題の1つです。それでも、そのためのデータモデルを設計するのは十分に困難です。通常、休日は毎年決まった日になりますが、これはすべての国のすべての休日に当てはまるわけではありません。さまざまな国の休日を分析すると、このデータモデルの設計に伴う複雑さを簡単に予測できます。

    さまざまな国の休日に関するいくつかの興味深い事実を見てみましょう:

    • 多くの休日、特に愛国心が強い休日は、毎年決まった日に観察されます。

      例:

      アメリカとインドの独立記念日は、それぞれ7月4日と8月15日に行われます。

    • 一部の祝日は毎年特定の日に祝われますが、必ずしも同じ暦日であるとは限りません。

      例:

      アメリカでの感謝祭は、11月の第4木曜日に祝われます。昨年(2015年)これは11月26日に落ちました。今年は11月24日です。

    • 年末年始の祝日もありますが、土曜日または日曜日の場合は、故意に翌月曜日に変更して長い週末を過ごします。このような休日は、「月曜日」と呼ばれることもあります。 。

      例:

      オーストラリアとニュージーランドでは、アンザックデーは2月6日に祝われますが、その日が土曜日または日曜日に当たる場合、休日は1日か2日後の月曜日に行われます。

      もう1つの良い例は、中国のレイバーデーです。この休日も「月曜日」です。

    • 一部の休日の日付は、他の休日と衝突する場合、1週間ずれます。

      例:

      オーストラリアの家族とコミュニティの日は10月の第1月曜日に祝われますが、レイバーデーも第1月曜日に当たる場合、家族の日は10月の第2月曜日にシフトされます。

    • すべての休日が銀行の休日として観察されるわけではありません つまり、銀行、金融機関、株式市場、および政府機関が閉鎖されている休日です。 (米国とカナダでは、銀行の休日は連邦または法定の休日として知られています。)
    • 愛国的な祝日は毎年同じ日に厳守されます。当日は、国内のすべての地域のすべての機関および事務所(銀行を含む)が閉鎖されます。ただし、米国やカナダなどの一部の国では、これらの休日が週末に当たる場合、次の月曜日にも監視されます。つまり、銀行や政府機関はその月曜日に閉鎖されます。
    • 同じ名前の休日は、国によって異なる日に観察されます。

      例:

      レイバーデーはインドでは5月1日に観察されますが、カナダでは9月の第1月曜日に観察されます。

    • 一部の休日の休日は、従来、休日以外の休日とバンドルされています。

      例:

      中国と南アフリカの労働者の日は1日観察されますが、他の2日は含まれます。

    • その他の日は、技術的には休日ではありませんが、通常、休業日として許可されています。

      例:

      米国では、感謝祭後の金曜日は非公式にブラックフライデーとして知られています。政府の休日ではありませんが、多くの企業が従業員に休日を与えています。

    • 一部の休日は、国内の地域によって観察方法が異なります。

      例:

      英国のサマーバンクホリデーは、スコットランドでは8月の第1月曜日に祝われますが、イングランド、ガーンジー、ジャージー、北アイルランド、ウェールズでは8月の最終月曜日に同じ祝日があります。

    • 国の一部で、特定の地域または地方の祝日が見られます。これらは、宗教的、民族的、または文化的なイベントに関連している可能性があります。

      例:

      ルイリエルの日は、カナダのマニトバ州でのみ祝われます。

    • 特定の休日の一部の遵守日は、「前」または「後」の条件に基づいています。

      例:

      • 国民愛国者の日は、カナダのケベック州での月曜日に行われます。 5月25日。
      • ドイツの悔い改めの日は、直前の水曜日に行われます。 11月23日。
      • Jeune Genevois スイスでは、木曜日に次のが観察されます。 9月の第1日曜日。
    • 特定の休日のお祝いの日は、一般的に使用されているグレゴリオ暦と一致しない古いカレンダーに基づいています。したがって、日付は毎年異なります。

      例:

      • イースターは、3月21日またはその直後に満月が発生した後の最初の日曜日に祝われます。
      • ディワリ祭(古代ヒンズー教の祭り)は、アシュビンのヒンズー教の朔望月の終わりからカルティカの月の初めまで、数日間にわたって祝われます。通常、これはグレゴリオ暦の10月中旬から11月中旬のどこかに該当します。
    • 正教会のクリスマス–これは古いユリウス暦に従います。 2016年現在、ユリウス暦とグレゴリオ暦には13日の違いがあります。その結果、正教会のクリスマスは2016年1月7日になります。

    事実の要約

    国際的に認められているグレゴリオ暦のみを検討していることに注意してください。 (太陽周期に続く)何年にもわたって国の休日のデータ母集団を自動化するため。この記事では、太陰太陽暦、ヘブライ暦、ヒンドゥー暦は考慮していません (月の周期に従います)。ただし、これらのカレンダーは、世界の特定の地域でフォローされています。今のところ、これらのカレンダーに基づく休日は手動でシステムに入力できます

    要約すると、国全体の休日は、日付の導出方法に基づいて分類できます。

    • 定休日 –毎年決まった日に発生する休日。
    • 移動可能な休日 –2月の第1月曜日や11月の第3木曜日など、特定の日に当たる休日。
    • 調整可能な休日 –いずれかのカテゴリに分類される休日ですが、他の祝日との衝突(または週末との衝突)を避けるために他の日に観察される場合や、同じ日付の他の休日との衝突のために翌週にシフトされる場合があります。
    • 他のカレンダーに基づく休日 –月暦、正教会暦、またはヒンドゥー暦に基づく休日の行事。今のところ、これらは手動でモデルに入力されます。

    場所に基づいて、休日をさらに2つのカテゴリに分類できます。 それらは観察されます:

    • 国民の祝日 –国レベルで観察される休日。
    • 地域または地方の祝日 –国の特定の州または地域で観察される休日。

    ほとんどすべての国で、国および地域の祝日は国または地域レベルで銀行の祝日として観察されます。ただし、すべての休日が銀行の休日であるとは限らないため、どの休日が銀行の休日で、どの休日がそうでないかを指定する必要があります。

    この時点で、特定の事業分野のいくつかの理論的シナリオも検討する必要があります。例:

    • 一部の国では、銀行やその他の金融機関は、四半期ごとの初日に休日が与えられます。
    • 一部の組織は、四半期ごとの結果を公開した後、休日を与えます。

    これらのポイントがデータモデルの設計にも含まれていることを確認します。

    包括的な休日データモデルの設計

    データモデルを設計する際には、週が日曜日に始まるという米国の慣習を使用します。必要に応じて、後でこれを変更することはそれほど難しくありません。

    このデータモデル全体は、「カレンダー」、「休日」、「国」の3つの主題分野を中心に展開されます。

    「カレンダー」サブジェクトエリア

    この領域には、calendar 何年もの間日付を保存します。また、事前に計算された数値を格納するための追加の列がいくつかあります。これは、特定の移動可能な休日の日付を導出するのに役立ちます。列は次のとおりです。

    • week_of_month
    • week_of_quarter
    • week_of_year
    • day_of_year
    • day_of_quarter

    このサブジェクトエリアには、さらに2つのテーブルがあります:day_of_week およびmonth_of_year

    それらの名前が示すように、これらのテーブルに個々の日と月の詳細を保存します。したがって、常にそれぞれ7レコードと12レコードがあります。このセクションで覚えておくべきことは次のとおりです。

    • これらの両方のテーブルのシーケンス列を使用して、週の開始を構成できます。今年の初めから同じことができます。
    • 両方のテーブルの主キーは、calendar テーブル。曜日と月の数値を格納します。
    • 年の値はcalendar_dateから抽出できます 列ですが、まだcalendar_yearを保持しています 別の列として。これにより、この列でテーブルを分割できるようになり、基盤となるSQLのパフォーマンスが向上します。
    • 数値列のサイズは、列の可能な値に基づいて定義されています。たとえば、day_of_year 1〜365の値である必要があるため、列のデータ型としてnumber(3)を定義します。

    「ホリデー」サブジェクトエリア

    前に述べたように、休日には固定と移動の2つのタイプがあります。そこで、タイプごとに1つずつ、2つの異なるテーブルを作成します。

    holiday_fixed テーブルはday_of_monthを使用します およびmonth_of_year_id 日と月の数値を格納する列。これらの値を使用して、定休日の日付を導き出すことができます。

    同様の行で、holiday_moveable 表では、次の列を使用して、移動可能な各休日の日付を導き出します。

    is_bank_holiday 列は、休日が銀行の休日であるかどうかを示します。つまり、すべての金融機関はその日に休業します。この列は両方のテーブルで必要です。

    is_mondayized 列は、土曜日または日曜日に該当するが、次の月曜日に観察される休日の日付を変更します。

    別のテーブル、つまりholiday_miscellaneous 、非グレゴリオ暦に基づいて休日のレコードを保存します。レコードはこのテーブルに手動で挿入されます。

    これら3つのテーブルすべてに、holiday_category テーブル。これは、休日の性質に関するデータを保持します。ここには、次のようなさまざまなカテゴリがあります。

    • パブリック/バンクホリデー –銀行は正式に閉鎖されており、取引は行われません。
    • 州の祝日 –州のみのレベルでの祝日。
    • 国民の祝日 –一般的に、愛国的な記念日、または全国的に祝われる法律で定義された日。
    • 地元の休日 –地方自治体によって宣言され、特定の地域でのみ観察されます。
    • 遵守 –実際の日付ではなく、他の日(多くの場合月曜日)に祝われる休日。通常、人々は3日間の週末を過ごすことができます。

    state_idに気づいたはずです 3つの休日テーブルすべての列。次のセクションで、このコラムの重要性について話しましょう。

    「国」のサブジェクトエリア

    このサブジェクトエリアには2つのテーブルがあります:

    1. country –国名とIDを保存します。
    2. state –各国の州名や地域名、IDを保存します。

    最終的には、このstate 3つの休日テーブルすべてのテーブルを使用して、休日が属する地域、州、国を判別します。

    多くの休日は国レベルで祝われるため、そのような休日の州レベルの記録をholiday テーブル。それは非常に冗長になります。代わりに、state 状態名が「ALL」のテーブル。このレコードは、その国のすべての休日にマッピングできるため、holiday 不必要にテーブル。

    最終的な休日のデータモデル

    ここで完全な休日データモデルを見てみましょう:




    このモデルで遊ぶにはいくつかの方法があります。例:

    • ポーランドなど、特定の国で観察されたすべての休日のリストを取得します。

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

    • 2018年の感謝祭の日付を探す–これは、米国のすべての州で11月の第4木曜日に祝われることを忘れないでください。

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

    • すべての国で独立記念日が祝われる時期のリストを入手してください。通常、これは毎年決まった日付であり、その日は国のすべての地域で厳しく守られています。

      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;
      

    休日データモデルを使用する

    このデータモデルを試してみませんか?頑張れ。これが私たちが考えたクエリのほんの一部です:

    • さまざまな国でレイバーデーが行われる日付を見つけます。
    • 英国のすべての地域の2016年のすべての休日のリストを取得します。
    • 2016年にフランスで観察されたすべての銀行休暇のリストを作成します。
    • 2016年にカナダのマニトバ州で観察されたすべての休日のリストを取得します。

    休日の詳細をアプリケーションにどのように保存しましたか?私はあなたのアイデアを聞いてみたいです。このメタデータの保存に関する経験と、ソリューションに対する見解をお気軽に共有してください。


    1. SisenseでのJavaデータの操作

    2. MySQLの文字セットと照合を理解する

    3. 大量のメモリを消費する大規模なDjangoQuerySetを反復処理するのはなぜですか?

    4. SQL Serverリストテーブル:すべてのテーブルを表示する方法