Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Xem các ngày lễ bằng con mắt của Người lập mô hình dữ liệu

Lễ ăn mừng!! Thời gian cho gia đình!! Lái xe dài !! Một ngày trên bãi biển!! Tất cả những từ này cứ lởn vởn trong tâm trí chúng ta khi chúng ta nghĩ đến những ngày nghỉ. Bạn đã bao giờ xem xét cách một công ty đa quốc gia theo dõi các ngày lễ trên toàn cầu chưa? Phải có một từ điển dữ liệu để duy trì tất cả các chi tiết này để họ có thể đảm bảo hoạt động kinh doanh liền mạch với các đối tác địa phương của họ.

Bài viết này sẽ giải thích một mô hình dữ liệu như vậy.

Tóm tắt các yêu cầu của dự án

Tôi có những yêu cầu khá đơn giản và dễ hiểu lần này. Tôi cần xây dựng một từ điển dữ liệu cho các ngày lễ ở nhiều quốc gia. Tôi muốn xây dựng nó như một thành phần có thể được tích hợp vào mô hình dữ liệu chính khi cần thiết.

Về một số thông tin thú vị về các ngày lễ ở khắp các quốc gia

Về mặt yêu cầu dự án của nó, đây là một trong những vấn đề đơn giản nhất trong mô hình hóa dữ liệu. Tuy nhiên, thật khó để thiết kế một mô hình dữ liệu cho nó. Thông thường các ngày lễ rơi vào một ngày cố định hàng năm, nhưng điều này không đúng với mọi ngày lễ ở mọi quốc gia. Nếu chúng ta phân tích các ngày lễ ở các quốc gia khác nhau, chúng ta có thể dễ dàng thấy trước những phức tạp liên quan đến thiết kế mô hình dữ liệu này.

Hãy cùng xem một số sự thật thú vị về các ngày lễ ở các quốc gia khác nhau:

  • Nhiều ngày lễ, đặc biệt là những ngày lễ yêu nước, được tổ chức vào một ngày cố định hàng năm.

    Ví dụ:

    Ngày Độc lập ở Hoa Kỳ và Ấn Độ lần lượt được tổ chức vào ngày 4 tháng 7 và ngày 15 tháng 8.

  • Một số ngày lễ được tổ chức vào một ngày cụ thể mỗi năm - nhưng không phải lúc nào cũng trùng ngày theo lịch.

    Ví dụ:

    Ngày Lễ Tạ ơn ở Hoa Kỳ được tổ chức vào ngày 4 thứ Năm trong tháng Mười Một. Năm ngoái (2015) điều này rơi vào ngày 26 tháng 11; năm nay, nó sẽ là ngày 24 tháng 11.

  • Một số ngày lễ được tổ chức vào một ngày cố định trong năm, nhưng nếu ngày đó rơi vào thứ Bảy hoặc Chủ nhật, thì ngày lễ chủ ý được chuyển sang thứ Hai tiếp theo để giữ một ngày cuối tuần dài. Ngày lễ như vậy đôi khi được gọi là ‘Thứ hai hóa’ .

    Ví dụ:

    Ở Úc và New Zealand, Ngày ANZAC được tổ chức vào ngày 6 tháng 2, nhưng nếu ngày đó rơi vào Thứ Bảy hoặc Chủ Nhật, thì ngày lễ sẽ được tổ chức vào Thứ Hai sau đó một hoặc hai ngày.

    Một ví dụ điển hình khác là Ngày Lao động ở Trung Quốc. Ngày lễ này cũng được 'thứ hai hóa'.

  • Ngày của một số ngày lễ được thay đổi theo một tuần nếu chúng trùng với một số ngày lễ khác.

    Ví dụ:

    Ngày Gia đình và Cộng đồng ở Úc được tổ chức vào Thứ Hai đầu tiên của tháng 10, nhưng nếu Ngày Lao động cũng rơi vào Thứ Hai đầu tiên, thì Ngày Gia đình được chuyển sang Thứ Hai thứ hai trong tháng 10.

  • Không phải tất cả các ngày lễ đều được coi là ngày lễ của ngân hàng , tức là các ngày lễ khi các ngân hàng, viện tài chính, thị trường chứng khoán và văn phòng chính phủ đóng cửa. (Ở Hoa Kỳ và Canada, ngày lễ ngân hàng được gọi là ngày lễ liên bang hoặc theo luật định.)
  • Các ngày lễ yêu nước được tổ chức nghiêm túc vào cùng một ngày hàng năm. Tất cả các viện và văn phòng (kể cả ngân hàng) trên mọi miền đất nước đều đóng cửa vào ngày đó. Tuy nhiên, ở một số quốc gia, chẳng hạn như Hoa Kỳ và Canada, nếu những ngày lễ này rơi vào cuối tuần thì chúng cũng sẽ được tổ chức vào thứ Hai tuần sau - nghĩa là các ngân hàng và văn phòng chính phủ sẽ đóng cửa vào thứ Hai đó.
  • Các ngày lễ trùng tên được tổ chức vào các ngày khác nhau ở các quốc gia khác nhau.

    Ví dụ:

    Ngày Lao động được tổ chức vào ngày 1 tháng 5 ở Ấn Độ, trong khi ngày thứ Hai đầu tiên của tháng 9 ở Canada.

  • Một số ngày nghỉ lễ theo truyền thống được gộp chung với những ngày nghỉ không phải ngày lễ.

    Ví dụ:

    Ngày Lao động ở Trung Quốc và Nam Phi được tổ chức vào một ngày, nhưng hai ngày khác được bao gồm.

  • Những ngày khác, mặc dù không phải ngày nghỉ về mặt kỹ thuật, thường được cho phép là ngày không làm việc.

    Ví dụ:

    Ở Hoa Kỳ, Thứ Sáu sau Lễ Tạ ơn được gọi không chính thức là Thứ Sáu Đen. Đây không phải là ngày nghỉ của chính phủ, nhưng nhiều công ty cho nhân viên của họ nghỉ cả ngày.

  • Một số ngày lễ được diễn ra khác nhau ở các vùng khác nhau trong một quốc gia.

    Ví dụ:

    Ngày lễ Ngân hàng mùa hè ở Vương quốc Anh được tổ chức vào Thứ Hai đầu tiên của tháng Tám ở Scotland, nhưng ngày lễ tương tự được tổ chức vào Thứ Hai cuối cùng của Tháng Tám ở Anh, Guernsey, Jersey, Bắc Ireland và Wales.

  • Một số ngày lễ của vùng hoặc địa phương chỉ được tổ chức ở một phần của quốc gia. Các sự kiện này có thể liên quan đến các sự kiện tôn giáo, dân tộc hoặc văn hóa.

    Ví dụ:

    Ngày Louis Riel chỉ được tổ chức ở tỉnh Manitoba của Canada.

  • Một số ngày tuân thủ cho một số ngày lễ nhất định dựa trên điều kiện "trước" hoặc "sau".

    Ví dụ:

    • Ngày Yêu nước Quốc gia được tổ chức ở tỉnh Quebec của Canada vào thứ Hai trước ngày 25 tháng 5.
    • Ngày Ăn năn ở Đức được tổ chức vào thứ Tư ngay sau trước 23 tháng 11.
    • Jeune Genevois ở Thụy Sĩ được quan sát vào thứ Năm sau Chủ nhật đầu tiên của tháng 9.
  • Một số ngày kỷ niệm ngày lễ được dựa trên các lịch cũ hơn không khớp với lịch Gregorian thường được sử dụng. Do đó, ngày của họ thay đổi hàng năm.

    Ví dụ:

    • Lễ Phục sinh được tổ chức vào Chủ nhật đầu tiên sau khi trăng tròn diễn ra vào hoặc sớm nhất sau ngày 21 tháng 3.
    • Diwali (một lễ hội Hindu cổ đại) được tổ chức trong nhiều ngày, từ cuối tháng Ashvin âm lịch của người Hindu và đầu tháng Kartika. Thông thường, điều này rơi vào khoảng giữa tháng 10 và giữa tháng 11 theo lịch Gregory.
  • Lễ Giáng sinh chính thống - Lịch này tuân theo lịch Julian cũ hơn. Tính đến năm 2016, có sự khác biệt 13 ngày giữa lịch Julian và lịch Gregorian. Do đó, Giáng sinh Chính thống giáo rơi vào ngày 7 tháng 1 năm 2016.

Tóm tắt sự kiện

Điều quan trọng cần lưu ý là Tôi chỉ đang xem xét lịch Gregorian được quốc tế chấp nhận (theo chu kỳ mặt trời) để tự động hóa dân số dữ liệu cho các ngày lễ trong năm và các quốc gia. Trong bài viết này, Tôi không xem xét lịch Lunisolar, Hebrew hoặc Hindu (theo chu kỳ mặt trăng). Tuy nhiên, các lịch này đang được theo dõi ở các khu vực cụ thể trên thế giới. Hiện tại, ngày lễ dựa trên các lịch này có thể được đưa vào hệ thống theo cách thủ công .

Tóm lại, các ngày lễ ở các quốc gia có thể được phân loại dựa trên cách lấy ngày của họ:

  • Các ngày lễ cố định - Các ngày lễ diễn ra vào một ngày cố định hàng năm.
  • Các Kỳ nghỉ Di động - Các ngày lễ rơi vào một ngày cụ thể, chẳng hạn như thứ Hai đầu tiên của tháng Hai hoặc thứ Năm thứ ba của tháng 11.
  • Các ngày lễ có thể điều chỉnh - Các ngày lễ thuộc một trong hai loại, nhưng đôi khi được tổ chức vào những ngày khác để tránh xung đột với các lễ kỷ niệm khác (hoặc xung đột với cuối tuần) hoặc chuyển sang tuần tiếp theo do trùng với các ngày lễ khác trong cùng một ngày.
  • Ngày nghỉ dựa trên các lịch khác - Các quan sát ngày lễ dựa trên âm lịch, Chính thống giáo hoặc lịch Hindu. Hiện tại, những thứ này được đưa vào mô hình của chúng tôi theo cách thủ công.

Chúng tôi có thể thêm ngày lễ thành hai danh mục dựa trên ở đâu chúng được quan sát:

  • Các ngày lễ quốc gia - Các ngày lễ được tổ chức ở cấp quốc gia.
  • Các ngày lễ của Vùng hoặc Địa phương - Các ngày lễ được tổ chức ở một tiểu bang hoặc khu vực cụ thể của một quốc gia.

Ở hầu hết các quốc gia, ngày lễ quốc gia và khu vực được coi là ngày lễ ngân hàng ở cấp quốc gia hoặc khu vực. Tuy nhiên, không phải tất cả các ngày nghỉ đều là ngày nghỉ của ngân hàng, vì vậy chúng ta nên chỉ định ngày nghỉ nào là ngày nghỉ lễ ngân hàng và ngày nghỉ lễ nào không.

Tại thời điểm này, chúng ta cũng nên xem xét một số kịch bản lý thuyết cho các lĩnh vực kinh doanh cụ thể. Ví dụ:

  • Ở một số quốc gia, các ngân hàng và tổ chức tài chính khác được nghỉ một ngày vào ngày đầu tiên của mỗi quý.
  • Một số tổ chức cho nghỉ một ngày sau khi công bố kết quả hàng quý của họ.

Chúng tôi sẽ đảm bảo những điểm này cũng được đưa vào thiết kế mô hình dữ liệu của chúng tôi.

Thiết kế Mô hình Dữ liệu Toàn diện về Kỳ nghỉ

Trong khi thiết kế mô hình dữ liệu, tôi sẽ sử dụng quy ước của Hoa Kỳ rằng tuần bắt đầu vào Chủ nhật. Sẽ không quá khó để thay đổi điều này sau này nếu cần.

Toàn bộ mô hình dữ liệu này sẽ xoay quanh ba lĩnh vực chủ đề:“Lịch”, “Ngày lễ” và “Quốc gia”.

Khu vực chủ đề "Lịch"

Trong khu vực này, có một bảng chính được đặt tên là calendar lưu trữ ngày tháng trong nhiều năm. Cũng sẽ có một số cột bổ sung để lưu trữ các giá trị số được tính toán trước, điều này sẽ giúp chúng tôi tính toán ngày cho một số ngày lễ có thể di chuyển nhất định. Các cột như sau:

  • week_of_month
  • week_of_quarter
  • week_of_year
  • day_of_year
  • day_of_quarter

Có hai bảng khác trong chủ đề này:day_of_weekmonth_of_year .

Như tên của chúng gợi ý, chúng tôi sẽ lưu trữ thông tin chi tiết của từng ngày và tháng trong các bảng này. Do đó, họ sẽ luôn có lần lượt 7 và 12 kỷ lục. Một số điều cần ghi nhớ cho phần này là:

  • Chúng tôi có thể định cấu hình đầu tuần bằng cột tuần tự trong cả hai bảng này. Chúng ta có thể làm điều tương tự vào đầu năm nay.
  • Khóa chính của cả hai bảng đều được tham chiếu trong calendar bàn. Chúng lưu trữ các giá trị số cho các ngày trong tuần và các tháng trong năm.
  • Giá trị của một năm có thể được trích xuất từ ​​calendar_date nhưng tôi vẫn giữ calendar_year như một cột riêng biệt. Điều này cho phép chúng tôi phân vùng bảng trên cột này, do đó sẽ mang lại hiệu suất tốt hơn cho các SQL bên dưới.
  • Kích thước của cột số đã được xác định dựa trên các giá trị có thể có cho cột. Ví dụ:day_of_year phải là một số giá trị từ 1 đến 365, vì vậy tôi xác định số (3) là loại dữ liệu của cột.

Chủ đề "Kỳ nghỉ"

Như chúng tôi đã nói trước đây, có hai loại ngày nghỉ - cố định và di chuyển. Vì vậy, chúng tôi sẽ tạo hai bảng khác nhau, mỗi bảng một bảng.

holiday_fixed bảng sử dụng day_of_monthmonth_of_year_id cột để lưu trữ các giá trị số cho ngày và tháng. Sử dụng các giá trị này, chúng ta có thể xác định ngày cho một ngày nghỉ cố định.

Trên các dòng tương tự, holiday_moveable bảng sẽ sử dụng các cột sau để lấy ngày cho mỗi kỳ nghỉ có thể di chuyển:

is_bank_holiday cột cho biết ngày lễ có phải là ngày lễ của ngân hàng hay không, tức là tất cả các tổ chức tài chính đều đóng cửa vào ngày đó. Cột này là bắt buộc trong cả hai bảng.

is_mondayized cột sửa đổi ngày cho các ngày lễ rơi vào Thứ Bảy hoặc Chủ Nhật nhưng được theo dõi vào Thứ Hai tiếp theo.

Chúng ta cũng hãy tạo một bảng khác, cụ thể là holiday_miscellaneous , để lưu trữ hồ sơ cho các ngày lễ dựa trên lịch không phải của Gregorian. Các bản ghi sẽ được chèn vào bảng này theo cách thủ công.

Tất cả ba bảng này có một cột tham chiếu đến holiday_category bàn. Điều này chứa dữ liệu về bản chất của kỳ nghỉ. Có thể có nhiều danh mục khác nhau ở đây, bao gồm:

  • Ngày lễ Ngân hàng / Công cộng - Các ngân hàng chính thức đóng cửa và không có giao dịch nào diễn ra.
  • Ngày lễ của Tiểu bang - Các ngày nghỉ lễ ở cấp tiểu bang.
  • Ngày lễ quốc gia - Nói chung là một ngày kỷ niệm yêu nước hoặc một ngày theo quy định của pháp luật được tổ chức trên toàn quốc.
  • Ngày lễ địa phương - Do chính quyền địa phương công bố và chỉ được quan sát trong một khu vực cụ thể.
  • Mức độ quan sát - Các ngày lễ không được tổ chức vào ngày thực tế của họ, nhưng vào một số ngày khác (thường là thứ Hai). Thường cho phép mọi người có ba ngày cuối tuần.

Bạn hẳn đã nhận thấy state_id trong cả ba bảng kỳ nghỉ. Hãy nói về tầm quan trọng của cột này trong phần tiếp theo.

Khu vực chủ đề "Quốc gia"

Chúng tôi có hai bảng trong chủ đề này:

  1. country - nơi lưu trữ tên và ID quốc gia;
  2. state - nơi lưu trữ tên và ID của tiểu bang và / hoặc khu vực cho từng quốc gia riêng lẻ.

Cuối cùng, chúng tôi sẽ đề cập đến state trong cả ba bảng ngày lễ để xác định ngày lễ thuộc về khu vực, tiểu bang và quốc gia nào.

Vì nhiều ngày lễ được tổ chức ở cấp quốc gia, nên không có ý nghĩa gì nếu giữ hồ sơ cấp tiểu bang cho những ngày lễ đó trong holiday bàn. Điều đó sẽ trở nên cực kỳ thừa. Thay vào đó, chúng tôi có thể có một bản ghi ở state bảng có 'ALL' làm tên tiểu bang. Bản ghi này có thể được lập bản đồ với tất cả các ngày lễ của quốc gia đó, do đó loại bỏ nhu cầu lưu giữ các bản ghi khổng lồ trong holiday bảng không cần thiết.

Mô hình dữ liệu kỳ nghỉ cuối cùng

Hãy cùng xem mô hình dữ liệu ngày lễ đầy đủ tại đây:




Có một số cách chúng ta có thể chơi với mô hình này. Ví dụ:

  • Nhận danh sách tất cả các ngày lễ được quan sát ở một quốc gia cụ thể, chẳng hạn như Ba Lan.

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

  • Tìm ngày cho Ngày Lễ Tạ ơn năm 2018 - Hãy nhớ rằng ngày này được tổ chức ở tất cả các bang của Hoa Kỳ vào thứ Năm thứ tư của tháng 11.

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

  • Nhận danh sách về thời điểm Ngày Độc lập được tổ chức ở tất cả các quốc gia. Thông thường, ngày này diễn ra vào một ngày cố định hàng năm và ngày này được tuân thủ nghiêm ngặt ở tất cả các khu vực của đất nước.

    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;
    

Đưa mô hình dữ liệu ngày lễ vào sử dụng

Bạn có muốn thử với mô hình dữ liệu này không? Cứ liều thử đi. Đây chỉ là một số truy vấn chúng tôi nghĩ ra:

  • Tìm các ngày tổ chức Ngày Lao động ở các quốc gia khác nhau.
  • Nhận danh sách tất cả các ngày lễ trong năm 2016 ở mọi nơi trên Vương quốc Anh.
  • Lập danh sách tất cả các ngày lễ của ngân hàng ở Pháp trong năm 2016.
  • Nhận danh sách tất cả các ngày lễ ở tỉnh Manitoba của Canada trong năm 2016.

Bạn đã quản lý như thế nào để lưu trữ thông tin chi tiết về kỳ nghỉ trong ứng dụng của mình? Tôi rất thích nghe những ý tưởng của bạn. Vui lòng chia sẻ kinh nghiệm của bạn với việc lưu trữ siêu dữ liệu này cũng như cách bạn sử dụng giải pháp của chúng tôi.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Câu lệnh SQL DROP TABLE và các trường hợp sử dụng khác nhau

  2. Aqua Data Studio

  3. Hiểu sự kiện mất mát với sự kiện mở rộng

  4. Quần đảo T-SQL Challenge

  5. Những điều thú vị về INSTEAD OF trigger