2011-09-04 8 views
0

Je travaille sur un projet qui doit stocker les horaires des employés. Par exemple, un employé travaille du lundi au jeudi de 8h à 14h et de 16h à 20h. Un autre employé peut travailler du mardi au samedi de 6h à 15h.Comment stocker les horaires?

Je recherche un algorithme ou une méthode pour stocker ce type de données dans une base de données MySQL. Ces données seront rarement accessibles, ce n'est donc pas une question de performance importante.

J'ai pensé à le stocker sous forme de chaîne mais je ne connais aucun algorithme pour "encoder" et "décoder" cette chaîne.

+0

Veuillez ne pas le stocker comme une chaîne "cryptée". –

+0

J'espère que vous croyez que vous voulez dire modèle. –

+0

Peut-être qu'il veut dire "encoder" et "décoder"? –

Répondre

2

Comme la plupart des commentaires l'indiquent, c'est généralement une mauvaise idée de coder toutes les données dans une chaîne qui n'a pratiquement aucun sens pour la base de données. Il est généralement préférable de définir les éléments de données et leurs relations et de représenter ces structures dans la base de données. Le Wikipedia article on data models est un bon aperçu de ce qui est impliqué (bien que ce soit plus général que ce dont vous avez besoin). Le problème que vous décrivez semble assez simple pour que vous puissiez le faire avec un crayon et du papier. Une manière de commencer est d'écrire une liste de relations logiques entre les concepts de votre problème. Par exemple, la liste peut ressembler à ceci (vos règles peuvent être différentes):

  • Chaque employé suit un horaire unique.
  • Chaque employé a un prénom et un nom, ainsi qu'une identification d'employé. Différents employés peuvent avoir le même nom, mais l'ID de chaque employé est unique à cet employé.
  • Un horaire comporte un jour de début et de fin de la semaine ainsi qu'une heure de début et de fin de journée.
  • L'heure de début et de fin est la même pour tous les jours de l'horaire.
  • Plusieurs employés peuvent être dans le même horaire.

De cela, vous pouvez lister les noms utilisés dans les règles. Ce sont des candidats pour les entités (colonnes) dans la base de données:

  • employé
  • ID employé
  • prénom de l'employé
  • employé nom
  • Horaire
  • Horaire début jour
  • Horaire de départ
  • Horaire fin de la journée
  • heure de fin Horaire

Pour les règles que j'ai énuméré, les horaires semblent exister indépendamment des employés.Comme il faut être un moyen d'identification qui l'employée suit, il est logique d'ajouter une entité:

  • ID annexe

Si vous regardez ensuite les verbes dans les règles ("suit "," a ", etc.), vous commencez à maîtriser les relations. Je regrouperais tout jusqu'à présent dans deux relations:

Employees 
    ID 
    first_name 
    last_name 
    schedule_ID 

Schedules 
    ID 
    start_day 
    start_time 
    end_day 
    end_time 

Cela semble être tout ce dont on a besoin en termes de structures de données. (Une alternative raisonnable à start_day et end_day pour la table Schedules serait un champ booléen pour chaque jour de la semaine.) L'étape suivante consiste à concevoir les index. Ceci est motivé par les requêtes que vous vous attendez à faire. Vous pouvez vous attendre à rechercher les éléments suivants:

  • Quel horaire est employé avec ID = xyz suivant?
  • Qui est au travail le lundi à midi?
  • Quels jours n'ont personne au travail?

Étant donné que les employés et les horaires sont identifiés de manière unique par leurs ID respectifs, ils doivent être les champs primaires de leurs tables respectives. Vous souhaitez également avoir des règles de cohérence pour les données. (Par exemple, vous ne voulez pas un employé sur une planification qui n'est pas définie.) Cela peut être géré en définissant une relation "clé étrangère" entre le champ Employees.schedule_ID et le champ Schedules.ID, ce qui signifie que Employees.schedule_ID doit être indexé. Cependant, puisque les employés peuvent partager le même horaire, il ne devrait pas être un index unique.

Si vous avez besoin de rechercher des horaires par jour de la semaine et heure de la journée, ceux-ci pourraient également valoir la peine d'être indexés. Enfin, si vous voulez rechercher les employés par leur nom, ces champs devraient peut-être aussi être indexés.

+0

Ok, mais avec ce schéma, comment représentez-vous le premier exemple Jeudi de 8h à 14h et de 16h à 20h "). Le jour de début et le jour de fin sont corrects, mais pour représenter l'heure de début et l'heure de fin, j'ai besoin de 2 lignes dans le tableau "Schedules", mais "Employees" n'a qu'un seul schedule_ID ... Je crains que nous ayons besoin d'une troisième table vrai? – Ivan

+0

Peut-être que oui. La méthodologie est la même: commencez avec l'ensemble des règles qui s'appliquent dans le domaine. Évidemment, la règle que j'ai utilisée: _ "Un horaire a un jour de début et de fin de la semaine et un heure de début et de fin de la journée." _ Ne s'applique pas. Vous avez juste besoin de faire la même chose: écrire les règles correctes, transformer les noms en entités, et utiliser les verbes pour définir les relations, à partir de laquelle vous formez ensuite des tables. Des problèmes techniques tels que la représentation de relations plusieurs-à-plusieurs peuvent nécessiter l'introduction de tables qui ne sont pas évidentes à partir de la description du domaine, mais qui tombent naturellement au fur et à mesure que vous progressez dans le processus. –

-1

En supposant que vous utilisez PHP:

Stockez un calendrier dans un tableau php, puis utilisez la fonction sérialiser pour le transformer en chaîne; pour récupérer l'utilisation du tableau unserialize. Cependant, cette forme de mémorisation n'est presque jamais une bonne idée.

+0

Ok, mais .. Ma question concerne la méthode pour stocker ce genre de données. Comment le stockez-vous en PHP? – Ivan

+0

de la même façon que vous stockez des chaînes dans un mysql db – Simone

+0

Et 50 ans d'algèbre relationnelle ont été balayés par la fenêtre ... Je ne vais pas -1 (pour les remarques finales), mais les bases de données relationnelles sont de belles choses * utilisé correctement *. –

Questions connexes