Bonsoir Fae,
Rien de tel qu’un MCD pour y voir clair ! Malgré quelques petites erreurs, le vôtre mérite une bonne note
A propos du nom des entités-types
A l’instar de l’auteur de référence D. Nanci(1) (RIP), j’utilise le terme entité type ou plutôt entité-type (avec un trait d’union entre entité et type), terme synonyme de « type d’entité ». D’autres auteurs de référence utilisent une terminologie différente mais équivalente : Classe d’entités (P. Bergougnoux, papa de Looping), individu-type (Tardieu, Rochfeld, Tabourier). Souvent les gens abrègent entité-type en entité, mais je considère cela comme du relâchement, en tout cas un manque de rigueur.
Il est important de noter qu’en fait une entité-type est la conséquence d’un prédicat dont les propositions sont des entités. En ce sens, Le Professeur Bergougnoux est explicite quand il privilégie le terme Classe d’entités. Quoi qu’il en soit, ce que j’écrivais dans le post #4 va dans le même sens :
Envoyé par
fsmrel
Une variable relationnelle est la conséquence d’un prédicat, c’est-à-dire que, pour un logicien, QUALIFICATION se lit :
L’employé id_emp est qualifié pour piloter le type d’avion type_avion
Les tuples <e01 type01>, <e01 type03>, etc. sont les instances du prédicat.
Autre conséquence : comme tout prédicat, QUALIFICATION s’écrit au singulier.
Ce qui vaut pour une relvar (variable relationnelle) vaut bien entendu pour une entité-type, représentant le prédicat suivant :
L’employé id_emp a pour nom nom_emp et a pour salaire annuel salaire_annuel
Ce prédicat a lui-même un nom, à savoir EMPLOYE, et comme tout prédicat on l’écrit au singulier.
Les instances du prédicat EMPLOYE ne sont plus appelées des tuples, mais des occurrences, ce qui revient au même, bien qu’on puisse chipoter en disant que tuple est plus précis (tuple est l’abréviation de n-tuple, n-uplet en français où n désigne le degré de la relvar, c’est-à-dire le nombre de ses attributs, n = 3 dans le cas de EMPLOYE).
Au même titre que les tuples de la théorie relationnelle, les occurrences merisiennes suivantes sont les instances, les propositions du prédicat EMPLOYE :
<e01 Fernand 50000>
<e02 Raoul 45000>
<e03 Paul 45000>
<e04 Patricia 45000>
En français, sous forme de propositions :
L’employé e01 a pour nom Fernand et a pour salaire annuel 50000
L’employé e02 a pour nom Raoul et a pour salaire annuel 45000
L’employé e03 a pour nom Paul et a pour salaire annuel 45000
L’employé e04 a pour nom Patricia et a pour salaire annuel 45000
Et comme tout prédicat, EMPLOYE s’écrit au singulier ! Cela vaut évidement pour VOL, AVION, QUALIFICATION. L’emploi du pluriel est une erreur.
Concernant les associations
Selon les auteurs on utilise soit le terme association soit le terme relation, voire relation type. Pour ma part, j’utilise association, mais employez le terme qui vous convient le mieux. En tout cas, vos associations sont correctes.
Concernant les cardinalités
Les cardinalités sont portées par les pattes connectant les entités-types et les associations. Vous êtes dans les clous, sauf pour la cardinalité 1,N portée par la patte connectant EMPLOYE et QUALIFIER. En effet, 1,N signifie que tout employé est qualifié pour piloter, ce qui n’est pas le cas. En effet, dans votre énoncé initial (post #1) il est précisé que les pilotes sont qualifiés pour piloter au moins un type d’avion, ce qui les distingue des autres employés : du fait de ces autres employés qui ne pilotent pas mais n’en font pas moins l’objet d’occurrences de l’entité-type EMPLOYE, on est astreint à remplacer 1,N par 0,N.
Une erreur classique
La connaissance de l’avion qui effectue un vol donné est fournie par l’association EFFECTUER car la patte connectant cette association et l’entité-type VOL est 1,1. L’attribut id_avion doit donc disparaître de l’entité-type VOL, sa présence contrevient à la règle « one fact, one place ». C’est à l’occasion de la génération du MLD et du code SQL de création des tables que l’AGL générera dans la table VOL l’attribut (ou colonne) rendu nécessaire à ce stade, id_avion, tout comme il générera les attributs id_emp et id_avion dans la table QUALIFIER.
Passage au MLD et au code SQL
Vous mentionnez des problèmes au stade SQL. Je vous engage à utiliser l’excellent Looping, gracieusement proposé par le professeur Patrick Bergougnoux (merci Paprick !). Jetez un bon coup d’oeil au forum Looping.
Avec Looping, dans la fenêtre des propriétés, vous pouvez choisir votre SGBD :
Propriétés > MLD- SQL > SGBD cible
Même si ACCESS n’est pas vraiment un SGBD, il fait partie de la liste.
Voilà par exemple dans le cas d’ACCESS ce que génère Looping si dans la barre d’outils (accès rapide) je clique sur l’icône « Script SQL au format TXT » :
Sub Create_Tables()
DoCmd.RunSQL "CREATE TABLE AVION(" & _
"id_avion INT," & _
"type_avion VARCHAR(16) NOT NULL," & _
"distance_croisiere INT NOT NULL," & _
"CONSTRAINT AVION_PK PRIMARY KEY(id_avion)" & _
");"
DoCmd.RunSQL "CREATE TABLE VOL(" & _
"n_vol INT," & _
"ville_dep VARCHAR(48) NOT NULL," & _
"ville_arr VARCHAR(48) NOT NULL," & _
"distance INT NOT NULL," & _
"heure_dep DATETIME NOT NULL," & _
"heure_arr DATETIME NOT NULL," & _
"id_avion INT NOT NULL," & _
"CONSTRAINT VOL_PK PRIMARY KEY(n_vol)," & _
"CONSTRAINT VOL_AVION_FK FOREIGN KEY(id_avion) REFERENCES AVION(id_avion)" & _
");"
DoCmd.RunSQL "CREATE TABLE EMPLOYE(" & _
"id_emp INT," & _
"nom_emp VARCHAR(48) NOT NULL," & _
"salaire_annuel INT NOT NULL," & _
"CONSTRAINT EMPLOYE_PK PRIMARY KEY(id_emp)" & _
");"
DoCmd.RunSQL "CREATE TABLE QUALIFIER(" & _
"id_avion INT," & _
"id_emp INT," & _
"type_avion VARCHAR(16) NOT NULL," & _
"CONSTRAINT QUALIFIER_PK PRIMARY KEY(id_avion, id_emp)," & _
"CONSTRAINT QUALIFIER_AVION_FK FOREIGN KEY(id_avion) REFERENCES AVION(id_avion)," & _
"CONSTRAINT QUALIFIER_EMPLOYE_FK FOREIGN KEY(id_emp) REFERENCES EMPLOYE(id_emp)" & _
");"
End Sub
Vu les votes, des réponses vous ont apporté une aide bienvenue
_____________________________
(1) D. Nanci, B. Espinasse Ingénierie des systèmes d’information : Merise deuxième génération (4e édition, 2001).
Partager