Hai una vacanza e le informazioni di base su di essa.
Holiday:
holidayId (pk)
name
Che tipo di vacanze abbiamo? Ci sono le vacanze fisse, le vacanze in movimento e le vacanze "Non ho intenzione di disturbare il calcolo" (Pasqua, ti sto guardando).
Per questo, avresti dei sottotitoli.
Ci sono le vacanze fisse e ripetute. Cose come il Natale e il prossimo luglio. Queste sono festività che cadono lo stesso giorno del mese ogni anno.
FixedHoliday
FixedHoldiayId (pk)
HolidayId (fk)
MonthOfYear
DayOfMonth
Allora hai anche i mobili. Festa del lavoro (primo lunedì di settembre), Giornata della memoria (lo scorso lunedì di maggio), Ringraziamento (giovedì di novembre).
Il modo più semplice per avvicinarti è dare un giorno intervallo per il giorno.
MoveableHoliday
MoveableHoldaiYid (pk)
HolidayId (fk)
MonthOfYear
DayOfWeek
EarliestDay
LatestDay
Se il tuo database supporta un tipo di intervallo potresti volerlo usare. Non tutti lo fanno, e quindi l'approccio a due date.
Perché due giorni? Diamo un'occhiata al Labor day. Il primo che può essere è il 1 settembre st - se il lunedì cade sul primo. L'ultimo che il primo lunedì può cadere è il 6 settembre th . Lunedì 7 settembre th significherebbe che il 1 settembre st era un lunedì ed era il Labor Day.
Per il Memorial Day, l'ultimo lunedì di maggio (che ha 31 giorni), l'intervallo per le date valide è il 25 th attraverso il 31 st .
Alcune righe di esempio:
MoveableHoliday | Labor | Memorial | Thanksgiving
MonthOfYear | Sep | May | Nov
DayOfWeek | Mon | Mon | Thurs
EarliestDay | 1 | 25 | 22
LatestDay | 6 | 31 | 28
Questo ci porta all'approccio "Non ho intenzione di calcolare quello" - è la prima domenica dopo la prima luna piena che si verifica dopo il 21 st di marzo ... e sì Se ci si è veramente scavati dentro, si potrebbe scrivere una stored procedure che contiene il calcolo per la luna piena (o averla in un'altra tabella, ancora una volta, che ha bisogno di popolare quella tabella), oppure si può semplicemente dì "non ce ne sono abbastanza per davvero fare la differenza " e basta popolarlo.
Questo è molto simile alla vacanza fissa, tranne che è solo per un anno.
SpecificDayHoliday
SpecificDayHolidayId (pk)
HolidayId (fk)
MonthOfYear
DayOfMonth
Year
A questo punto, compila il tavolo come vuoi per quanto lontano vuoi.
Ora puoi mettere insieme le tabelle SpecificDayHoliday e FixedHoldiay e rendere Anno opzionale. Tuttavia, ritengo che ciò renda più facile lavorare con ogni tabella - ognuno di essi ha un singolo tipo di valore che va dentro di essi. In particolare, SpecificDayHoliday consente a più valori HolidayID di essere uguali nella tabella. FixedHoliday e MoveableHoliday devono avere un vincolo sulla tabella che rende HolidayId univoco all'interno della tabella.