Che enorme lattina di vermi si sta aprendo qui amico. Dopo aver lavorato per un'azienda che fa solo sistemi di clock, è qualcosa che non vorrò più fare!
Mi rendo conto che la mia risposta è molto concettuale e affronta alcuni aspetti al di fuori della portata normale della domanda, ma questo è per delineare la progettazione del database e i concetti strutturali in questo tipo di applicazione. Questa informazione deriva dal recente sviluppo specialistico che ho fatto in questo settore, quindi non è solo ipotetico, ma dimostrato nella pratica.
Quando si guarda a questo tipo di sistema, è preferibile utilizzare inizialmente indicatori come indicatori, in genere si tratta della quantità di punzoni rispetto al confronto di ogni record. Confrontare ogni record con 1.000 dipendenti non è la cosa migliore!
Ad esempio, se l'utente ha in un periodo di 24 ore 8 pugni (inizio della giornata, inizio pausa mattutina, fine pausa mattutina, inizio pranzo, fine pranzo, inizio pausa pomeridiana, fine pausa pomeriggio e fine giornata) può determinare che è improbabile che non ci siano stati pugni mancati nel periodo e che si siano verificati degli straordinari, tuttavia se ci sono stati 7 pugni nel periodo di 24 ore (inizio della giornata, inizio della pausa mattutina, fine della pausa mattutina, inizio del pranzo, fine del pranzo, pomeriggio pausa inizio e fine giornata) si sa che manca un pugno e la persona ha dimenticato di uscire per il giorno. Notate come la fine della pausa pomeridiana non c'è.
Tuttavia questo non è a prova di tutto e fornisce solo un riferimento indicativo, sarà necessario confrontare un programma di turno con i pugni per assicurarsi che nulla sia stato effettivamente perso. Perché è possibile che sia la fine del pranzo sia la pausa pomeridiana siano state entrambe perse lasciando 6 pugni che puoi impostare il tuo codice per segnalare tutto ciò che non è il numero X di pugni per quel dipendente. Quando viene segnalato, esegui il confronto effettivo su quel dipendente per quel periodo per capire cosa è effettivamente successo e cosa è mancato.
Questo non significa che non si confronta tutti i record, la cosa è comunque in funzione del numero di dipendenti che potrebbe causare alcuni grossi problemi a fare il confronto esatta su ogni record, è qui che è generalmente migliore per i numeri più grandi dei dipendenti di utilizzare 2 server, 1 solo per raccolta dati e solo interfaccia, il secondo per l'esecuzione di processi di confronto.
Come ho già detto, per questo tipo di applicazione e per lavorare con orari diversi, è anche necessario tenere in considerazione gli orari dei turni per confrontarli. Dovrai tenere un record di riempimento per ogni dipendente che darà uguale tempo prima di un turno di inizio e dopo un turno di fine. Ciò significa che le probabilità di straordinari che si estendono oltre 1 periodo di tempo saranno minime. Il formulare di base è molto semplice: numero di ore nel turno - 24 ore/2 = tempo di riempimento
Ora si posiziona il tempo di riempimento prima e dopo il programma di turni per quell'utente. Ma devi ancora gestire uno scambio di turno, cambiare o più di un turno di 24 ore. Questo è dove diventa davvero difficile. Dovrai cercare di tenere una tabella di tempi di sovrapposizione (padding, shift e punch) che possono essere riconciliati con eventuali aggiustamenti futuri ai programmi, poiché le modifiche dei fatti non sono rare nel tempo.
Ora vorrai anche tenere una tabella di periodi di assenteismo per assenze per malattia e ferie, questi dati dovranno quindi essere segnalati generalmente all'interno della tabella di punch-in/punch-out in quanto questo è ciò con cui ti confronti. Quando viene impostato un flag per un periodo, il record può essere saltato in confronto e una nota lasciata sul report senza dover eseguire ulteriori operazioni per controllarlo.
Quasi alla fine, si noti come è necessario dimenticare le convenzioni di data/ora normale per misurare questo per un intervallo di variabili? Per non parlare di lavorare in modo efficace ed efficiente in più date? Per questo motivo generalmente è meglio lavorare solo con i tempi di inizio e di fine di gg/mm/AAAA hh: mm: ss, per le misurazioni usare il tempo UNIX per calcolare quanto tempo è trascorso. Dicendo che per essere in grado di controllare la maggior parte dei sistemi è necessario un record "data stamp", quindi è probabile che l'elaborazione lato server di questo sia richiesta quando si inseriscono i report.
Infine, vorrei anche consigliare di tenere una tabella dei risultati, questo darebbe i risultati di reporting per ogni utente, in questo modo quando si desidera fornire record storici è possibile generare dinamicamente documenti tuttavia non si deve sprecare potenza di elaborazione confrontare i record ogni volta che viene richiesto un report.
Spero che questo aiuti!
Ciò aggiungerebbe la complessità inutile a capire se la persona si è spenta prima di ricominciare. Il design originale è migliore. Le tabelle EAV dovrebbero essere evitate ogni volta che possono essere evitate. – HLGEM
No, quello originale diventa super complicato, lo sto dicendo per esperienza. Qualsiasi novizio si rivolge al progetto originale, non avendo notato che db non dovrebbe fornire resoconti del proprio desiderio ma fornire dati in forma meno ridondante. È possibile mantenere una tabella ridondante di report consolidato (in-out) per il recupero rapido. – shikhar
@shikhar Potrebbe essere giusto. Dai un'occhiata a questa domanda che ho postato. http://stackoverflow.com/questions/12632302/design-to-represent-employee-check-in-and-check-out –