2010-12-06 2 views
2

Donc, j'ai déjà développé un système de planification des employés en php. C'était très inefficace. Lorsque j'ai créé un nouveau calendrier, j'ai généré une ligne dans une table appelée «planifications» et, pour chaque employé affecté par ce planning, j'ai généré une ligne dans une table appelée 'schedule_days' qui donnait l'heure de début et de fin pour cette date spécifique . En outre, l'édition des horaires était une épave aussi. Sur la page d'édition, j'ai extrait chaque utilisateur de la base de données du calendrier spécifique et l'ai imprimé sur la page. C'était très logique, mais c'était très lent.Horaires et la base de données

Vous pouvez imaginer combien de temps il faut pour charger une quinzaine d'employés pendant une semaine. Ce serait 1 requête pour le calendrier, 1 requête pour chaque utilisateur, et 7 requêtes pour chaque jour pour chaque utilisateur .. Si j'ai 15 utilisateurs c'est trop de requêtes. Donc, je demande simplement, quel est le point de vue de quelqu'un d'autre sur la meilleure façon de le faire?

+0

Notez que je maintiens un système presque exactement comme le vôtre (que je n'ai pas écrit) et après 3 ans la base de données est énorme et lente. Parce que les horaires doivent être pré-générés, il y a un travail en arrière-plan qui pré-génère des années de données, et quand quelqu'un change de programme, toute l'année des données pré-générées doit être supprimée, le nouvel ensemble l'année de données doit être générée, puis les exceptions de l'ancien calendrier doivent être mappées au nouveau calendrier. C'est un cauchemar... – Kendrick

Répondre

2

Pour les planifications basées sur la rotation, vous souhaitez utiliser un système basé sur l'exclusion. Si vous savez que l'employé x travaille en rotation y dans la plage de dates z, vous pouvez calculer les jours individuels pour cet employé à la volée. S'ils sont malades/en cours/etc., ajoutez une exclusion à l'employé pour ce jour. Cela rendra la base de données beaucoup plus petite que le suivi chaque jour pour chaque employé.

table employee {EmployeeID} 
table employeeRotations {EmployeeRotationID, EmployeeID, RotationID, StartDate, EndDate} 
table rotation {RotationID, NumberOfDays, StartDate} 
table rotationDay {RotationDayID, RotationID, ScheduledDay, StartTime, EndTime} 
table employeeExceptions {EmployeeExceptionID, ExceptionDate, ExceptionTypeID (or whatever you want here)} 

À partir de là, vous pouvez écrire une fonction qui retourne On/Off/Exception pour une date donnée ou une semaine donnée.

2

Il semble que vous ayez besoin d'apprendre à faire un JOIN plutôt que de faire plusieurs allers-retours au serveur pour chaque élément.

Questions connexes