Creare una tabella separata per le ore di lavoro dei dipendenti?

0

Ho una tabella con le informazioni sui dipendenti:

id, active, first_name, last_name, gender, id_number, address, picture, password, comment

Ogni dipendente ha un orario di ingresso e un'ora di uscita per ogni giorno della settimana eccetto il sabato. È possibile che un dipendente abbia due tempi di entrata e due tempi di uscita (quando sceglie di fare una pausa).

Quindi, ad esempio, un dipendente potrebbe avere il seguente schema dell'orario di lavoro:

         | Sunday  |  Monday  |  Tuesday  |  Wednesday  |  Thursday  |  Friday
---------+-------------------------------------------------------------------
Entrance | 08:00      08:00       07:30        07:30        07:30       07:00
Exit     | 16:00      13:00       12:30        15:30        12:30       15:00
Entrance |   -        13:30       13:00          -          13:00         -
Exit     |   -        16:30       16:00          -          16:00         -

Ho pensato di aggiungere questa informazione alla tabella Employee , quindi le colonne sarebbero come tali:

id, active, first_name, last_name, gender, id_number, address, picture, password, comment, 1st_entrance_sunday, 1st_exit_sunday, 1st_entrance_monday, 1st_exit_monday, 1st_entrance_tuesday, 1st_exit_tuesday, 1st_entrance_wednesday, 1st_exit_wednesday, 1st_entrance_thursday, 1st_exit_thursday, 1st_entrance_friday, 1st_exit_friday, 2st_entrance_sunday, 2st_exit_sunday, 2st_entrance_monday, 2st_exit_monday, 2st_entrance_tuesday, 2st_exit_tuesday, 2st_entrance_wednesday, 2st_exit_wednesday, 2st_entrance_thursday, 2st_exit_thursday, 2st_entrance_friday, 2st_exit_friday.

Ma sembra ... sbagliato. Così ho pensato di creare un'altra tabella WorkHours per questo, con queste colonne:

employee_id, day, entrance, exit

Qual è il modo più semplice e pulito, ma è logico? Voglio dire, questa è un'informazione sul dipendente, quindi non dovrebbe essere nella tabella Employee ? Hai un suggerimento per un approccio completamente diverso?

    
posta Sipo 31.05.2016 - 09:13
fonte

2 risposte

4

Normalizzazione del database

Prima forma normale (1NF)

  • Elimina colonne duplicate
  • Crea tabelle separate per ogni gruppo di dati correlati

Dovresti creare una tabella employee_access e ogni volta che un dipendente inserisce o chiude il record dell'edificio la data e l'ora:

id , employee_id , date_time , operazione

Il campo

operazione dovrebbe contenere IN o OUT

Potresti chiedere perché non due campi (in_time e out_time)?

  • Velocità
  • semplicità
  • versatilità

Se la tua azienda è come la mia, le persone usano per registrare diversi OUT o IN e non esattamente a coppie (a volte si collegano IN quando escono, ma si chiamano Managers);)

    
risposta data 31.05.2016 - 14:40
fonte
3

Non dovrebbe essere nella tabella dei dipendenti perché avremo colonne denominate "entrance_Sunday", "exit_Sunday", "entrance_Monday", ecc.

Questo è un pessimo design. Supponiamo di avere un'altra tabella con una colonna contenente un valore "giorno della settimana". Non sarai in grado di unirti a queste tabelle senza un pessimo SQL:

SELECT 
  CASE calendar.day_of_week 
     WHEN 'Sunday' THEN entrance_Sunday
     WHEN 'Monday' THEN entrance_Monday
     ...

FROM holiday_calendar
INNER JOIN employees 

Con una tabella di programmazione separata è semplice:

SELECT ... FROM calendar
INNER JOIN schedule ON schedule.day_of_week = calendar.day_of_week
    
risposta data 31.05.2016 - 10:09
fonte

Leggi altre domande sui tag