Quel schéma relationnel est le bon ?

Quel schéma relationnel est le bon ? - SQL/NoSQL - Programmation

Marsh Posté le 07-11-2008 à 11:32:18    

Bonjour,
 
Exemple simple : soit 2 tables
table 1 : EMPLOYES [id_employe, nom, prenom, agence_de_rattachement (stocke un id_ag) , lieu_de_travail (stocke un id_ag), Responsable(stocke unid_employe)]
table 2 : AGENCES [d_ag, nom_agence]
 
Supposons que 1 employe ne peut travailler et appartenir qu'à 1 agence mais que celle puisse être différente
(ex: Je travaille dans l'agence B, mais je dépend du siège qui est l'agence A)
 
1) Ai-je le droit de dans le cadre d'une BDD relationnelle de faire pointer ma table EMPLOYES deux fois sur la même table agence, car mon responsable me dit que je ne respecte pas la norme ? Il me dit qu'il faudrait une table AGENCE_TRAVAIL et une table AGENCE_RATTACHEMENT histoire que la table employe ne pointe pas sur la même table  
Est ce vrai ?
 
2) De la même façon ai-je le droit de stocker pour le Responsable  l'id_employe (du Responsable) venant de la même table ? boucle sur elle même


Message édité par Thelvyn777 le 21-11-2008 à 11:51:12
Reply

Marsh Posté le 07-11-2008 à 11:32:18   

Reply

Marsh Posté le 07-11-2008 à 12:15:14    

1 employé peut être rattaché à plusieurs agences, et une agence peut contenir plusieurs employés => relation plusieurs-à-plusieurs => il te faut une table intermédiaire entre les deux qui contiendra 2 champs (id de l'agence et id de l'employé).
toute autre façon de faire est de la pure bidouille qui ne respecte pas la norme.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-11-2008 à 13:07:39    

Tout à fait d'accord. Voir les normes http://fr.wikipedia.org/wiki/Forme [...] ionnelles) .

Reply

Marsh Posté le 07-11-2008 à 15:57:24    

Harkonnen a écrit :

1 employé peut être rattaché à plusieurs agences, et une agence peut contenir plusieurs employés => relation plusieurs-à-plusieurs => il te faut une table intermédiaire entre les deux qui contiendra 2 champs (id de l'agence et id de l'employé).
toute autre façon de faire est de la pure bidouille qui ne respecte pas la norme.


 
Je sais mais j'ai pris un cas simple en supposant que je n'ai que du 1-1  (dans ma vraie base j'ai bien au n-n avec table intermédiaire ) mais là n'est pas mon hésitation.
Je cherche à savoir si je pouvais stocker dans ma table EMPLOYE deux fois l' "id_agence" mais dans des champs différents (je suppose que je n'ai que du 1-1)
 
exemple de requete :
 

Code :
  1. SELECT e.nom,e.prenom,a1.agence_de_rattachement,a2.lieu_de_travail
  2. FROM employe AS e
  3. LEFT JOIN agence AS a1 ON e.agence_de_rattachement=a1.id_ag
  4. LEFT JOIN agence AS a2 ON e.lieu_de_travail=a2.id_ag


 
Est-ce correct ?

Message cité 1 fois
Message édité par Thelvyn777 le 07-11-2008 à 16:11:04
Reply

Marsh Posté le 07-11-2008 à 16:22:20    

Thelvyn777 a écrit :

 

Est-ce correct ?


pas du tout, tu ne peux faire de jointures entre 2 tables que sur un seul champ

Message cité 1 fois
Message édité par Harkonnen le 07-11-2008 à 16:22:33

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 07-11-2008 à 16:28:54    

Harkonnen a écrit :


pas du tout, tu ne peux faire de jointures entre 2 tables que sur un seul champ


 
Pourtant ce n'est pas ce qui dit ce post
http://forum.hardware.fr/hfr/Progr [...] 6838_1.htm
 
1) sinon alors comment faire ? créer une 2èmes table AGENCE reprenant les mêmes données (=> donc redondance)
2) passer par une table intermédiaire ? mais cela ne change pas le fait  que la requete doit se faire deux fois sur la même table puisque pour les 2 champs il faut passer par la table TABLE pour obtenir le nom
3) j'ai deux LEFT JOIN dans requete dc 2 jointures ?


Message édité par Thelvyn777 le 07-11-2008 à 16:31:36
Reply

Marsh Posté le 13-11-2008 à 09:54:56    

Quelqu'un aurait il un autre avis ?

Reply

Marsh Posté le 13-11-2008 à 10:10:08    

Peut être que si tu expliquais clairement ce que tu souhaites obtenir, aurais tu plus de réponses ? Parce que tu demandes "mais alors, comment faire ?", mais comment faire quoi ?


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 13-11-2008 à 12:15:17    

Petite précision : on peut faire des doubles jointures sur une même tables dans certains cas :
1) il y a 2 relations différentes entre 2 tables (ex : dans une GED, pour un document, y'a un auteur et un valideur, tous 2 issus de la même table "personnes" )
2) dans le cas de calculs/stats (ex : dans l'historique des changements d'état de tickets d'un help-desk, trouver tous les tickets qui ont été réouverts, c'est-à-dire, des ID d'états < à d'autres mais ayant une date de log > à ces autres ID d'états.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 21-11-2008 à 11:49:29    

Harkonnen a écrit :

Peut être que si tu expliquais clairement ce que tu souhaites obtenir, aurais tu plus de réponses ? Parce que tu demandes "mais alors, comment faire ?", mais comment faire quoi ?


 
Ce que je veux vraiment faire:
Gérer les affectations employés, agences, véhicules, missions de notre société de Transports
Nous devons pouvoir traiter les cas ou  :
- Employé A de l'agence B roule dans un véhicule C de l'agence D
- Employé A de l'agence B n'a pas forcement un véhicule d'affecté
- Véhicule C de l'agence D n'a pas forcement un employé d'affecté
- Un employé peut avoir une mission différente suivant s'il est dans l'agence A ou B
 
Ce que j'ai fait:
Table employes : id_emp, nom, prénom
Table véhicules : id_vh, immat
Table agences : id_ag, nom_ag
Table missions : id_miss, intitulé
Table aff_vh_ag : id_aff, id_vh, id_ag : table pour la jointure entre véhicules et agences
Table aff_emp_ag : id_aff, id_emp, id_ag, id_miss : table pour la jointure entre employes et agences,missions
Table aff_emp_vh : id_aff, id_emp, id_vh : table pour la jointure entre véhicules et employes
Ce qui fait que j'ai une double jointure sur les table agences,véhicule,chauffeur
Hors mon responsable me dit que ce schéma relationnel n'est pas bon
 
Ce qu'il me propose:
Table employes : id_employe, nom, prenom
Table véhicules : id_vh, immat
Table agences : id_ag, nom_ag
Table aff : id_aff, id_emp, id_ag, id_vh,id_miss
mais dans ce cas il est difficile de gérer les affectations lorsque  Employe A de l'agence B roule dans un véhicule C de l'agence D
De plus j'ai l'impression qu'on mélange tout: ex dans la même table là on a missions et véhicules alors que pour moi ça n'a aucun lien
 
Qui a raison ? Ou y a t il une autre solution

Reply

Marsh Posté le 21-11-2008 à 11:49:29   

Reply

Marsh Posté le 26-11-2008 à 17:56:18    

Si tu y arrives pas c'est qu'il te manque une table.
Dis toi les choses le plus simplement possible. => 3eme forme normale...
 
Table employes : id_employe, nom, prenom  
Table véhicules : id_vh, immat  
Table agences : id_ag, nom_ag  
 
Une voiture appartient à une agence.
Un employé est membre d'une agence.
Un employé utilise une voiture.
 
Ton champs id_miss je ne vois pas du tout à quoi ça correspond.


Message édité par smilaou le 26-11-2008 à 17:57:32
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed