2009-09-20 10 views
0

Je développe actuellement un site web pour un hôtel. Et l'une des choses que je suis sur le point de mettre en œuvre est la relation travailleur-supérieur. Quelle est la meilleure façon de le faire dans MySQL?Question sur la conception de la base de données

Voici ce que je veux dire: un supérieur du chef est un chef cuisinier, le supérieur du chef est le chef de quart, le supérieur du directeur de quart est le directeur général. Dans la table des employés, je pourrais faire un champ supérieur avec l'identification de l'employé supérieur mais alors je suis seulement capable d'obtenir un rôle supérieur/supérieur; Plus important encore, je ne serais pas en mesure de récupérer la liste de tous les employés que le gestionnaire gère à l'hôtel particulier.

Espérons que ce soit suffisamment clair sur ce que j'ai besoin de conseils sur ... merci pour votre effort.

+0

Vous voulez qu'un employé ait plusieurs patrons? – elviejo79

+0

Désolé j'ai oublié de mentionner qu'un employé peut avoir au plus 1 supérieur, il est donc important d'avoir une hiérarchie de haut en bas comme le directeur général peut voir les données de tous les employés. Contrairement au gestionnaire de quart qui est capable d'afficher les données de tous les employés, mais pas en mesure d'afficher les données des autres gestionnaires de quart. – ant

Répondre

1

Eh bien, avec un graphique simple de contiguïté (supervisor_id pointant à l'emplo Yees table), vous pouvez certainement faire ce que vous voulez, mais ce ne sera pas très efficace, et ne sera pas à l'échelle d'un grand nombre de personnes. Ce que vous voulez probablement est d'implémenter un nested set model. Cela vous permet de saisir très facilement tout le monde qui rapporte à une personne arbitraire dans l'organisation. Si vous êtes suffisamment en phase de développement, vous pouvez envisager d'utiliser le système Doctrine ORM, qui fournit un comportement nestedset pour les modèles, de sorte que vous n'avez pas besoin d'implémenter le vôtre.

Edit: Richard Knop a un message sur nested sets with php example code que vous trouverez peut-être plus utile que 100% des exemples -SQL de Čelko ..

+0

J'aime votre réponse, maintenant je vais faire un peu de lecture .. et j'espère que les choses seront comme ils sont censés être: D tnx – ant

+0

J'ai une question concernant cet article http://www.intelligententerprise.com/001020/celko.jhtml;jsessionid=CQYCHUUILHLFRQE1GHRSKH4ATMY32JVN comment insérer des données dans la base de données, en les insérant manuellement en créant un formulaire PHP pour le faire comme avec le calcul de ceux-ci: Cela a des résultats prévisibles que nous pouvons utiliser pour construire des requêtes. La racine est toujours de la forme (left = 1, right = 2 * (SELECT COUNT (*) FROM TreeTable)); les nœuds feuilles ont toujours (gauche + 1 = droite); le prédicat BETWEEN définit les sous-arbres; etc. – ant

+0

Je ne sais pas exactement ce que vous demandez, mais j'espère que le lien que j'ai ajouté à ma réponse vous aidera à comprendre les choses. – timdev

0

Vous pouvez obtenir une liste de tous les employés un gestionnaire gère en faisant cela sur vos onglets:

SELECT * FROM employees WHERE `superior`='id goes here' 

Mais si vous ou combat faisant plus d'un supérieur juste faire une nouvelle table avec des colonnes comme celui-ci

superior, person 

ou si vous voulez le montrer comme un arbre juste le faire dans une boucle de requêtes

+0

Désolé j'ai oublié de mentionner qu'un employé peut avoir au plus 1 supérieur, il est donc important d'avoir une hiérarchie de haut en bas comme le directeur général peut voir les données de tous les employés. Contrairement au gestionnaire de quart qui est capable d'afficher les données de tous les employés, mais pas en mesure d'afficher les données des autres gestionnaires de quart. – ant

+0

Eh bien c'est facile parce que alors vous faites comme la première requête ci-dessus – kennyisaheadbanger

0

Peut-être que vous seriez mieux créer une table ou d'une liste supplémentaire avec des rôles/fonctions et l'attribution niveaux à chaque fonction, donc un niveau 4 serait le boss direct d'un niveau 3, etc.

0

Je suggère un modèle de jeu imbriqué. Cependant, il a dit qu'il permettra seulement 1 personne d'avoir 1 gestionnaire directement au-dessus d'eux ...

J'ai écrit un blog à ce sujet il y a quelques années. OK c'est MSSQL mais il faut convertir en MySQL ok.

Link here

Cela montre comment insérer/déplacer/récupérer des listes complètes etc.

-2

Vous pouvez le faire avec trois champs, un « ID » et une gamme « d'ID gérés » (deux valeurs). Ces identifiants ne sont basés sur rien de réel, ils sont simplement pour décrire la hiérarchie.

Ensuite, pour trouver tous les employés gérés, vous sélectionnez tous les ID dans la plage «ID gérés» du gestionnaire. La gamme d'ID de hauts responsables couvre tout le monde, les gestionnaires sous lui couvrent une gamme plus restreinte, etc., jusqu'aux personnes qui ne gèrent personne et qui ont une gamme contenant eux-mêmes.Un problème avec cette conception est que lorsque vous mélangez des personnes ou que vous ajoutez de nouvelles personnes, vous devez parfois renuméroter tout le monde afin de garder la hiérarchie droite. Si vous utilisez un grand espacement des ID pour cela, vous n'avez pas à renuméroter le tout trop souvent. Ou vous pouvez utiliser des champs d'ID à virgule flottante. Edit: Après avoir lu les autres réponses, je remarque qu'il s'agit du modèle d'ensemble imbriqué, ou une variante de celui-ci.

0

Si vous avez affaire à des quarts de travail, le responsable du quart de travail variera séparément du personnel travaillant pour le quart de travail. C'est, cette semaine, un chef pourrait travailler le quart de temps de déjeuner sous un directeur de quart; la semaine prochaine, il pourrait travailler le quart du soir sous un autre gestionnaire. Assurez-vous de garder ces complexités à l'esprit.

Questions connexes