Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Melihat Liburan Dengan Mata Pemodel Data

Perayaan!! Waktu keluarga!! Perjalanan panjang!! Sehari di pantai!! Semua kata ini berdengung di benak kita ketika kita memikirkan liburan. Pernahkah Anda mempertimbangkan bagaimana perusahaan multinasional melacak liburan di seluruh dunia? Harus ada kamus data untuk menyimpan semua detail ini sehingga mereka dapat memastikan bisnis yang lancar dengan mitra lokal mereka.

Artikel ini akan menjelaskan model data seperti itu.

Singkatnya Persyaratan Proyek

Saya memiliki persyaratan yang cukup sederhana dan mudah kali ini. Saya perlu membuat kamus data untuk liburan di banyak negara. Saya ingin membangunnya sebagai komponen yang dapat diintegrasikan ke dalam model data utama kapan dan di mana diperlukan.

Tentang Beberapa Fakta Menarik Tentang Liburan di Berbagai Negara

Dalam hal persyaratan proyek, ini adalah salah satu masalah paling sederhana dalam pemodelan data. Namun cukup sulit untuk merancang model data untuk itu. Biasanya hari libur jatuh pada tanggal yang tetap setiap tahun, tetapi ini tidak berlaku untuk setiap hari libur di setiap negara. Jika kami menganalisis hari libur di berbagai negara, kami dapat dengan mudah memperkirakan komplikasi yang terlibat dalam desain model data ini.

Mari kita lihat beberapa fakta menarik tentang liburan di berbagai negara:

  • Banyak hari libur, terutama yang patriotik, dirayakan pada tanggal tertentu setiap tahun.

    Contoh:

    Hari Kemerdekaan di AS dan India diperingati masing-masing pada tanggal 4 Juli dan 15 Agustus.

  • Beberapa hari libur dirayakan pada hari tertentu setiap tahun – tetapi tidak selalu pada tanggal kalender yang sama.

    Contoh:

    Hari Thanksgiving di Amerika Serikat dirayakan pada 4 Kamis di bulan November. Tahun lalu (2015) ini jatuh pada 26 November; tahun ini adalah 24 November.

  • Beberapa hari libur dirayakan pada tanggal yang tetap dalam satu tahun, tetapi jika tanggal tersebut jatuh pada hari Sabtu atau Minggu, maka hari libur tersebut sengaja digeser ke hari Senin berikutnya untuk merayakan akhir pekan yang panjang. Hari libur seperti itu terkadang disebut 'Senin' .

    Contoh:

    Di Australia dan Selandia Baru, Hari ANZAC dirayakan pada tanggal 6 Februari, tetapi jika tanggal tersebut jatuh pada hari Sabtu atau Minggu, hari libur tersebut diperingati pada hari Senin satu atau dua hari kemudian.

    Contoh bagus lainnya adalah Hari Buruh di Cina. Liburan ini juga 'Senin'.

  • Tanggal beberapa hari libur digeser seminggu jika berbenturan dengan hari libur lainnya.

    Contoh:

    Hari Keluarga dan Komunitas di Australia dirayakan pada hari Senin pertama bulan Oktober, tetapi jika Hari Buruh juga jatuh pada hari Senin pertama, maka Hari Keluarga digeser ke hari Senin kedua di bulan Oktober.

  • Tidak semua hari libur dianggap sebagai hari libur bank , yaitu, hari libur ketika bank, lembaga keuangan, pasar saham, dan kantor pemerintah tutup. (Di AS dan Kanada, hari libur bank dikenal sebagai hari libur federal atau resmi.)
  • Liburan Patriotik diperingati secara ketat pada tanggal yang sama setiap tahun. Semua lembaga dan kantor (termasuk bank) di semua wilayah negara ditutup pada hari itu. Namun, di beberapa negara, seperti Amerika Serikat dan Kanada, jika hari libur ini jatuh pada akhir pekan, hari libur tersebut juga akan diamati pada hari Senin berikutnya – artinya, bank dan kantor pemerintah akan tutup pada hari Senin tersebut.
  • Hari libur dengan nama yang sama dirayakan pada hari yang berbeda di negara yang berbeda.

    Contoh:

    Hari Buruh diperingati pada 1 Mei di India, sedangkan di Kanada diperingati pada Senin pertama bulan September.

  • Beberapa hari libur biasanya digabungkan dengan hari libur non-libur.

    Contoh:

    Hari Buruh di Cina dan Afrika Selatan diperingati pada satu hari, tetapi dua hari libur lainnya disertakan.

  • Hari-hari lain, meskipun secara teknis bukan hari libur, biasanya diperbolehkan sebagai hari non-kerja.

    Contoh:

    Di Amerika Serikat, hari Jumat setelah Thanksgiving secara tidak resmi dikenal sebagai Black Friday. Ini bukan hari libur pemerintah, tetapi banyak perusahaan memberikan hari libur kepada karyawannya.

  • Beberapa hari libur diamati secara berbeda di berbagai wilayah di suatu negara.

    Contoh:

    Hari Libur Bank Musim Panas di Inggris dirayakan pada hari Senin pertama bulan Agustus di Skotlandia, tetapi hari libur yang sama dirayakan pada hari Senin terakhir bulan Agustus di Inggris, Guernsey, Jersey, Irlandia Utara, dan Wales.

  • Hari libur regional atau lokal tertentu diamati hanya di satu bagian negara. Ini mungkin terkait dengan acara keagamaan, etnis, atau budaya.

    Contoh:

    Hari Louis Riel dirayakan hanya di provinsi Manitoba, Kanada.

  • Beberapa hari perayaan untuk hari libur tertentu didasarkan pada kondisi 'sebelum' atau 'sesudah'.

    Contoh:

    • Hari Patriot Nasional diperingati di provinsi Quebec Kanada pada hari Senin sebelum 25 Mei.
    • Hari Pertobatan di Jerman diperingati pada hari Rabu tepat sebelum 23 November.
    • Jeune Genevois di Swiss diamati pada hari Kamis berikut Minggu pertama bulan September.
  • Hari-hari perayaan liburan tertentu didasarkan pada kalender lama yang tidak cocok dengan kalender Gregorian yang umum digunakan. Oleh karena itu, tanggal mereka berbeda setiap tahun.

    Contoh:

    • Paskah dirayakan pada hari Minggu pertama setelah bulan purnama yang terjadi pada atau paling cepat setelah 21 Maret.
    • Diwali (festival Hindu kuno) dirayakan selama beberapa hari, dari akhir bulan lunar Hindu Ashvin dan awal bulan Kartika. Biasanya, ini jatuh antara pertengahan Oktober dan pertengahan November dalam kalender Gregorian.
  • Natal Ortodoks – Ini mengikuti kalender Julian yang lebih tua. Pada 2016, ada perbedaan 13 hari antara kalender Julian dan kalender Gregorian. Akibatnya, Natal Ortodoks jatuh pada 7 Januari 2016.

Merangkum Fakta

Penting untuk diperhatikan bahwa Saya hanya mempertimbangkan kalender Gregorian yang diterima secara internasional (yang mengikuti siklus matahari) untuk mengotomatisasi populasi data untuk liburan selama bertahun-tahun dan negara. Dalam artikel ini, Saya tidak mempertimbangkan kalender Lunisolar, Ibrani, atau Hindu (yang mengikuti siklus bulan). Namun, kalender ini diikuti di wilayah tertentu di dunia. Untuk saat ini, hari libur berdasarkan kalender ini dapat dimasukkan ke dalam sistem secara manual .

Singkatnya, hari libur di seluruh negara dapat dikategorikan berdasarkan bagaimana tanggalnya berasal:

  • Hari Libur Tetap – Hari libur yang terjadi pada tanggal tetap setiap tahun.
  • Liburan Pindah – Hari libur yang jatuh pada hari tertentu, seperti Senin pertama bulan Februari atau Kamis ketiga bulan November.
  • Hari Libur yang Dapat Disesuaikan – Hari libur yang termasuk dalam salah satu kategori, tetapi terkadang diperingati pada hari lain untuk menghindari bentrok dengan perayaan lain (atau bentrok dengan akhir pekan) atau bergeser ke minggu berikutnya karena bentrok dengan hari libur lain pada tanggal yang sama.
  • Hari Libur Berdasarkan Kalender Lain – Perayaan hari libur yang didasarkan pada kalender lunar, Ortodoks, atau Hindu. Untuk saat ini, ini dimasukkan secara manual ke dalam model kami.

Kami selanjutnya dapat menempatkan liburan ke dalam dua kategori berdasarkan di mana mereka diamati:

  • Hari Libur Nasional – Hari libur yang diamati di tingkat negara.
  • Hari Libur Daerah atau Lokal – Hari libur yang dirayakan di negara bagian atau wilayah tertentu di suatu negara.

Di hampir semua negara, hari libur nasional dan regional diperingati sebagai hari libur bank di tingkat negara atau regional. Namun, tidak semua hari libur adalah hari libur bank, jadi kita harus menentukan hari libur mana yang merupakan hari libur bank dan mana yang bukan.

Pada titik ini, kita juga harus mempertimbangkan beberapa skenario teoretis untuk area bisnis tertentu. Misalnya:

  • Di beberapa negara, bank dan lembaga keuangan lainnya diberikan hari libur pada hari pertama setiap kuartal.
  • Beberapa organisasi memberikan hari libur setelah mempublikasikan hasil kuartalan mereka.

Kami akan memastikan poin-poin ini juga disertakan dalam desain model data kami.

Mendesain Model Data Liburan Komprehensif

Saat merancang model data, saya akan menggunakan konvensi AS bahwa minggu dimulai pada hari Minggu. Tidak akan terlalu sulit untuk mengubahnya nanti jika diperlukan.

Seluruh model data ini akan berkisar pada tiga bidang subjek:“Kalender”, “Liburan”, dan “Negara”.

Area Subjek “Kalender”

Di area ini, ada tabel utama bernama calendar yang menyimpan kurma selama bertahun-tahun. Juga akan ada beberapa kolom tambahan untuk menyimpan nilai numerik yang telah dihitung sebelumnya, yang akan membantu kami memperoleh tanggal untuk hari libur tertentu yang dapat dipindahkan. Kolom-kolomnya adalah sebagai berikut:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Ada dua tabel lagi di bidang subjek ini:day_of_week dan month_of_year .

Seperti namanya, kami akan menyimpan rincian hari dan bulan individu dalam tabel ini. Oleh karena itu, mereka akan selalu memiliki 7 dan 12 catatan masing-masing. Beberapa hal yang perlu diingat untuk bagian ini adalah:

  • Kita dapat mengonfigurasi awal minggu melalui kolom urutan di kedua tabel ini. Kita bisa melakukan hal yang sama di awal tahun.
  • Kunci utama dari kedua tabel dirujuk dalam calendar meja. Mereka menyimpan nilai numerik untuk hari dalam seminggu dan bulan dalam setahun.
  • Nilai satu tahun dapat diambil dari calendar_date kolom, tapi saya masih menyimpan calendar_year sebagai kolom terpisah. Hal ini memungkinkan kita untuk mempartisi tabel pada kolom ini, yang pada gilirannya memungkinkan kinerja yang lebih baik untuk SQL yang mendasarinya.
  • Ukuran kolom angka telah ditentukan berdasarkan kemungkinan nilai untuk kolom tersebut. Misalnya, day_of_year harus berupa nilai antara 1 dan 365, jadi saya mendefinisikan angka(3) sebagai tipe data kolom.

Area Subjek “Liburan”

Seperti yang kami katakan sebelumnya, ada dua jenis liburan – tetap dan bergerak. Jadi kita akan membuat dua tabel yang berbeda, satu untuk setiap jenis.

holiday_fixed tabel menggunakan day_of_month dan month_of_year_id kolom untuk menyimpan nilai numerik untuk hari dan bulan. Dengan menggunakan nilai ini, kita dapat memperoleh tanggal untuk hari libur tetap.

Pada baris yang sama, holiday_moveable tabel akan menggunakan kolom berikut untuk mendapatkan tanggal untuk setiap hari libur yang dapat dipindahkan:

is_bank_holiday kolom menandakan apakah hari libur adalah hari libur bank, yaitu, semua lembaga keuangan tutup pada hari itu. Kolom ini diperlukan di kedua tabel.

is_mondayized kolom mengubah tanggal untuk hari libur yang jatuh pada hari Sabtu atau Minggu tetapi diamati pada hari Senin berikutnya.

Mari kita juga membuat tabel lain, yaitu holiday_miscellaneous , untuk menyimpan catatan hari libur berdasarkan kalender non-Gregorian. Catatan akan dimasukkan ke dalam tabel ini secara manual.

Ketiga tabel ini memiliki satu kolom yang merujuk pada holiday_category meja. Ini menyimpan data tentang sifat liburan. Ada berbagai kategori di sini, termasuk:

  • Hari Libur Umum / Bank – Bank secara resmi ditutup dan tidak ada perdagangan yang dilakukan.
  • Hari Libur Negara – Hari libur nasional di tingkat negara bagian saja.
  • Hari Libur Nasional – Umumnya peringatan patriotik atau hari yang ditentukan oleh hukum yang dirayakan secara nasional.
  • Hari Libur Setempat – Dideklarasikan oleh pemerintah daerah, dan diamati hanya di wilayah tertentu.
  • Ketaatan – Hari libur yang tidak dirayakan pada tanggal sebenarnya, tetapi pada hari lain (biasanya hari Senin). Biasanya memungkinkan orang untuk memiliki akhir pekan tiga hari.

Anda pasti memperhatikan state_id kolom di ketiga tabel liburan. Mari kita bicara tentang pentingnya kolom ini di bagian selanjutnya.

Area Subjek “Negara”

Kami memiliki dua tabel dalam bidang subjek ini:

  1. country – yang menyimpan nama dan ID negara;
  2. state – yang menyimpan nama dan ID negara bagian dan/atau wilayah untuk setiap negara.

Akhirnya, kami akan merujuk ke state tabel di ketiga tabel liburan untuk menentukan wilayah, negara bagian, dan negara tempat liburan.

Karena banyak hari libur dirayakan di tingkat negara, tidak masuk akal untuk menyimpan catatan tingkat negara bagian untuk hari libur semacam itu di holiday meja. Itu akan menjadi sangat berlebihan. Sebagai gantinya, kita dapat memiliki satu record dalam state tabel dengan 'ALL' sebagai nama negara bagian. Catatan ini dapat dipetakan dengan semua hari libur di negara tersebut, sehingga menghilangkan kebutuhan untuk menyimpan catatan besar di holiday tabel yang tidak perlu.

Model Data Hari Libur Terakhir

Mari kita lihat model data liburan selengkapnya di sini:




Ada beberapa cara kita bisa bermain-main dengan model ini. Misalnya:

  • Dapatkan daftar semua hari libur yang diamati di negara tertentu, misalnya Polandia.

    Pilih hm.holiday_name, calendar_date, hm.is_bank_holiday dari calendar c, holiday_moveable hmWhere hm.month_of_year_id =c.month_of_year_id dan hm.day_of_week_id =c.day_of_week_id dan c.calendar_negara bagian =idhm. c di mana s.country_id =c.id dan c.country_name ='POLANDIA' )UNION ALLPilih hf.holiday_name, calendar_date, hf.is_bank_holiday dari kalender c, holiday_fixed hmWhere hm.month_of_year_id =c.month_of_year_to_day(of_hm c.calendar_date,'DD'))and c.calendar_year =2016And hm.state_id =(pilih state_id dari state s, country c di mana s.country_id =c.id dan c.country_name ='POLAND');

  • Temukan tanggal untuk Hari Thanksgiving di 2018 – Ingat, ini dirayakan di semua negara bagian AS pada Kamis keempat di bulan November.

    Pilih hm.holiday_name, calendar_date, hm.is_bank_holiday dari calendar c, holiday_moveable hmWhere hm.month_of_year_id =c.month_of_year_idAnd hm.day_of_week_id =c.day_of_week_idAnd c.calendar_year_holi ='Thm_dayhm. (pilih state_id dari state s, country c dimana s.country_id =c.id dan c.country_name ='USA' )

  • Dapatkan daftar kapan Hari Kemerdekaan dirayakan di semua negara. Biasanya, ini pada tanggal tetap setiap tahun, dan hari itu diamati dengan ketat di semua wilayah negara.

    Pilih c.country_name, calendar_date dari calendar c, holiday_fixed hf, state s, country cWhere hf.state_id =s.id dan s.country_id =c.idAnd s.state_name ='ALL'And c.month_of_year_id =hf. month_of_year_idAnd c.day_of_month =trunc(calendar_date)And hf.holiday_name ='HARI MERDEKA' dan c.calendar_year =2016;

Menggunakan Model Data Liburan

Apakah Anda ingin bermain-main dengan model data ini? Pergi untuk itu. Berikut adalah beberapa pertanyaan yang kami pikirkan:

  • Temukan tanggal Hari Buruh diperingati di berbagai negara.
  • Dapatkan daftar semua liburan 2016 untuk setiap bagian dari Inggris Raya.
  • Buat daftar semua hari libur bank yang diamati di Prancis pada tahun 2016.
  • Dapatkan daftar semua hari libur yang diamati di provinsi Manitoba Kanada pada tahun 2016.

Bagaimana Anda bisa menyimpan detail liburan di aplikasi Anda? Saya akan senang mendengar ide-ide Anda. Silakan, jangan ragu untuk membagikan pengalaman Anda dalam menyimpan metadata ini serta pendapat Anda tentang solusi kami.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 Metode Konversi Data SQL dan Kasus Penggunaan yang Luar Biasa

  2. Merancang Database untuk Sistem Rekrutmen

  3. Memperbaiki Kehilangan Data Menggunakan Pengiriman Log dengan Pemulihan Tertunda

  4. Kumpulan Masalah 1 – Mengidentifikasi Entitas

  5. Bug T-SQL, perangkap, dan praktik terbaik – fungsi jendela