Le schéma de base de données suivant sera utilisé pour l’ensemble du
sujet. Il permet de gérer une plateforme de vente de billets de spectacles en ligne :
Notez que les artistes et les spectateurs sont des personnes. Tous les attributs id
sont des clés primaires, ceux commençant par id sont des clés étrangères.
Donnez le modèle entité / association correspondant au schéma de notre base.
Pensez-vous qu’une association a été réifiée ? Si oui, laquelle ?
Donnez la commande de création de la table Spectacle
On veut qu’un même spectateur puisse avoir au plus un billet pour un spectacle.
Quelle dépendance fonctionnelle cela ajoute-t-il ? Que proposez-vous
pour en tenir compte dans le schéma ?
Le schéma E/A est donné dans la Fig. 73. Notez que l’on ne représente pas
les clés étrangères comme attributs des entités: les clés étrangères sont le mécanisme du modèle
relationnel pour représenter les liens entre entités. Dans le modele EA, ces liens sont
des associations, et il serait donc redondant de faire figure également les clés étrangères
Le nommage des assocations et des attributs est libre, l’important est de privilégier la clarté
et la précision, notamment pour les associations.
Le type d’entité Billet est issu d’une réification d’une association plusieurs-plusieurs. La principale
différence est que les billets ont maintenant leur identifiant propre, alors que l’association plusieurs-plusieurs
est identifiée par la paire (idSpectacle, idPersonne).
Voici la commande de création de la salle. On a choisi de mettre notnull partout
pour maximiser la qualité de la base, ce sont des contraintes que l’on peut facilement
lever si nécessaire.
Dans le schéma relationnel proposé,
il est possible d’avoir plusieurs billets (avec des identifiants distincts)
pour le même spectacle et le même spectateur. C’est un effet de la réification: on a perdu
la contrainte d’unicité sur la paire (idSpectacle, idPersonne).
On peut se poser la question d’ajouter ou non cette contrainte. Si oui, alors
(idSpectacle, idSpectateur) devient une clé secondaire, que l’on déclare avec
la clause unique dans la commande de création de la table Billet.
La jointure sur A et B avec R renvoie 5 nuplets: (1,0,1,2) s’associe à 2 nuplets dans
\(S \cup T\), de même que (1,0,1,1). (4,1,2,2) s’associe à un nuplet.
Tous les attributs en gras sont des clés primaires, ceux en italiques sont des clés étrangères. Notez
qu’une clé étrangère peut faire partie d’une clé primaire.
Chaque pays a une seule équipe en compétition. Une ville peut avoir plusieurs stades.
L’attribut But.penalty vaut VRAI si le but a été marqué suite a un penalty (coup de pied de réparation) ou
FAUX dans le cas contraire. Le nom de l’entraîneur d’une équipe est donné par l’attribut Equipe(entraîneur).
Etudions la conception de cette base en répondant aux questions suivantes.
Avec ce schéma, une équipe peut-elle jouer contre elle-même? Expliquez.
Avec ce schéma, un joueur peut-il marquer un but dans un match auquel
son équipe ne participe pas? Expliquez.
Est-il possible de savoir dans quelle ville a été marqué chaque but? Expliquez.
Donnez le schéma entité-association correspondant aux relations Match, Equipe, Stade.
Donnez la commande SQL de création de la table Match.
Citer au moins une clé candidate autre que la clé primaire parmi les attributs des tables (bien lire l’énoncé).
Quel serait l’impact si on la choisissait comme clé primaire?
Un de vos collègues propose de modéliser un but comme une association plusieurs-plusieurs
entre un joueur et un match. Cela vous semble-t-il une bonne idée? Cela correspond-il
au schéma relationnel de notre base?
Noms des joueurs âgés de plus de 30 ans qui ont
marqué un but dans la première minute de jeu.
Noms des joueurs français qui n’ont marqué aucun but
Le prix du billet le plus cher
Donnez le nom des entraineurs avec le nombre de buts marqués par leur équipe
Donnez le nom des joueurs ayant marqué un but dans un match auquel leur équipe
ne participe pas.
Les noms des joueurs français qui ont marqué un but lors d’un match entre la France et la Suisse
joué à Lille. Attention: dans la table Match
la France peut être l’équipe 1 ou l’équipe 2. Il faut
construire la requête qui correspond aux deux cas.
Parmi les phrases suivantes, lesquelles vous semblent exprimer une contrainte de cohérence correcte sur la base de données?
Pour chaque match nul, je dois trouver autant de lignes associées au match dans la table But pour l’équipe 1 et pour l’équipe 2.
Quand j’insère une ligne dans la table But pour l’équipe 1, je dois effectuer également une insertion pour l’équipe 2 dans la table But.
Si je trouve une ligne dans la table Match avec id=x, scoreEquipe1=y et scoreEquipe2=z, alors je dois trouver y+z lignes dans la table But avec idMatch=x.
Voici un programme en pseudo-code simplifié à exécuter chaque fois qu’un but est marqué dans un match, par un joueur et au bénéfice de la première équipe. Les “#” marquent des commentaires.
function marquer_but_eq1 (imatch, ijoueur, min, peno)
startTransaction
# Aselect scoreEquipe1 into :scoreE where idMatch= :imatch
#B
update Match setscoreEquipe1= :scoreE + 1 where idMatch= :imatch
# C
insert into But (idMatch, idJoueur, minute, penalty)
values (:idMatch, :ijoueur, :min, :peno)# D
Où faut-il selon-vous ajouter un ordre commit?
Juste après B et C
Juste après A
Juste après D
Justifiez votre réponse.
Supposons que je lance deux exécutions de marquer_but_eq1 en même temps.
Dans quel scénario l’exécution imbriquée amène-t-elle une incohérence?
On cherche à modéliser un laboratoire d’informatique afin de pouvoir gérer
ses équipes, ses chercheurs et leurs publications (articles).
L’analyse donne le schéma entité/association de la Fig. 74.
À partir de cette analyse, quelqu’un propose le schéma
relationnel suivant, dans lequel les clés primaires sont en gras
(à vous de trouver les clés étrangères):
Ce schéma relationnel représente-t-il correctement le modèle conceptuel de la Fig. 74?
Vérifiez les clés primaires et étrangères et proposez éventuellement des corrections.
On veut ajouter la position d’un chercheur dans l’ordre des auteurs pour un article. Où
placer cette information, dans le modèle entité association et dans le modèle relationnel?
Un article peut-il être rédigé par des chercheurs
appartenant à des équipes différentes (justifiez)?
Un chercheur peut-il diriger une équipe à laquelle il n’est pas rattaché (justifiez)?
Donnez les commandes createtable pour les tables Chercheur, Article et Rédige
(en tenant compte des corrections éventuelles de la question 1).
Correction
La clé de Rédige doit comprendre réfArticle en plus de idAuteur
On ajoute la position dans l’association Rédige (et dans la table correspondante).
Titre des articles parus depuis 2015 dont l’un au moins des auteurs appartient à l’équipe ROC
Quels articles n’ont pas d’auteur?
Titre des articles parus depuis 2015 dont tous les auteurs appartiennent à l’équipe ROC (aide:
la quantification universelle se remplace par la quantification existentielle et la négation)
Nom des chercheurs qui dirigent une équipe à laquelle ils n’appartiennent pas
Nom des chercheurs qui dirigent plus d’une équipe.
Soit deux transactions concurrentes \(T_1\) et \(T_2\). Quelle(s) affirmation(s), parmi les suivantes, est (sont) vraie(s)
dans un système transactionnel assurant les propriétés ACID
en isolation complète.
Si \(T_2\) débute après \(T_1\), \(T_1\) ne voit jamais les mises à jour de \(T_2\).
\(T_1\) ne voit pas ses propres mises à jour tant qu’elle n’a pas validé.
Si \(T_2\) débute après \(T_1\), \(T_1\) ne voit les mises à jour de \(T_2\) qu’après que \(T_2\) a effectué un commit.
Si \(T_1\) et \(T_2\) veulent modifier le même nuplet, cela déclenche un interblocage (deadlock).
Les auteurs, les propriétaires et les experts sont des personnes bien entendu.
Les clés primaires sont en gras,
les clés primaires ne sont pas explicitement indiquées.
Pour chaque table, donner les dépendances fonctionnelles liant les clés
primaires et clés étrangères (1 point)
En déduire les associations de type
plusieurs à 1 du schéma Entité/Association correspondant à ce schéma
relationnel (1 point)
Donner ce schéma Entité/Association complet (1 point)
Donner des commandes SQL permettant de créer les tables
Oeuvre et Personne (1 point)
J’ajoute la contrainte Un expert ne peut évaluer une œuvre qu’une
seule fois. Quelle est la dépendance fonctionnelle correspondante
et quel changement du schéma relationnel proposez-vous? (1 point)
Ce schéma permet-il de représenter le fait qu’une personne peut être à la fois
propriétaire et auteur d’une
même œuvre? Argumentez votre réponse. (1 point)
Correction
Dépendances entre clés primaires et clés étrangères :
Dans Oeuvre: \(idOeuvre \to idAuteur\) et \(idOeuvre \to idProprietaire\)
Dans Expertise: \(idExpertise \to idOeuvre\) et \(idExpertise \to idExpert\)
Chaque DF correspond à une association plusieurs à 1 (cf l’algorithme de normalisation).
On a donc ce type d’association entre Oeuvre et Personne, avec la sémantique « Auteur »,
entre Oeuvre et Personne une seconde fois mais avec la sémantique « Propriétaire »,
entre Expertise et Oeuvre et entre Expertise et Personne.
Le schéma EA se déduit immédiatement de ce qui précède. Il n’y a pas d’association
plusieurs à plusieurs.
On a donc la nouvelle dépendance \((idExpert, idOeuvre) \to valeur\).
Du coup la table Expertise
n’est plus en 3FN. Un changement possible est que (idExpert,idOeuvre) devienne la clé
de Expertise.
Oui, rien n’empêche idAuteur et idPropriétaire d’être égaux dans la table Oeuvre
On dispose de deux prédicats \(Auteur(x)\) et \(Prop(x)\) qui sont vrais si,
respectivement, \(x\) est auteur ou \(x\) est propriétaire.
Quelle formule exprime la condition « Soit \(x\) est propriétaire, soit \(x\) est auteur mais pas les deux »
Quelle est la négation de l’énoncé : « Soit \(x\) est propriétaire, soit \(x\) est auteur »
Comment exprimer l’énoncé suivant sans implication: « Si \(x\) est auteur, alors \(x\) n’est pas propriétaire »
(utiliser uniquement les connecteurs de SQL: and, or et not).
On dispose de deux tables \(T_1(A,B,C)\) et
\(T_2(D,E,F)\). Donnez une expression algébrique équivalente
à la suivante, avec les contraintes suivantes: on peut utiliser la jointure mais
pas le produit cartésien, et
une sélection doit s’apppliquer directement à une table.
\[\sigma_{A=C \land A=D \land E =F \land C > B (T_1 \times T_2)\]
Correction
\[\sigma_{A=C \land C > B (T_1) \Join_{A=D \sigma_{E = F(T_2)\]
On dispose d’une table \(T (id, valeur)\).
Initialement toutes les valeurs sont différentes.
Voici une procédure qui échange les valeurs de 2 nuplets.
createorreplaceprocedureEchange(id1INT,id2INT)AS-- Déclaration des variablesval1,val2integer;begin-- On recherche la valeur de id1 et de id2selectvaleurintoval1fromTwhereid=id1selectvaleurintoval2fromTwhereid=id2-- On échange les valeursupdateTSETvaleur=val1whereid=id2updateTSETvaleur=val2whereid=id1end;
On est en mode Autocommit: un commit a lieu après chaque requête SQL. Expliquez
dans quel scénario l’exécution concurrente de deux procédures d’échange peut aboutir
à ce que deux nuplets aient la même valeur.
Correction
La première procédure s’exécute jusqu’à la fin du premier UPDATE. Un commit automatique
a lieu: les deux nuplets sont alors égaux. Si la seconde procédure commence alors, elle trouvera
une base avec deux nuplets égaux, ce qui ne devrait jamais arriver avec nos hypothèses en mode sérialisable.
Le schéma de base de données suivant sera utilisé pour l’ensemble du
sujet. Il permet de gérer les souscriptions pour un ensemble
d’opérateurs de téléphonie mobile. Ce schéma sera nommé schéma final
par la suite.
Opérateur (id, nom)
Forfait (id, nom, idOpérateur, prix)
Client(id, nom, prénom, ville)
Souscription(idClient, idForfait, durée, numéro)
L’attribut durée est un entier positif exprimant le nombre de mois d’engagement.
les clés étrangères ne sont pas indiquées.
Donnez la liste des dépendances fonctionnelles définies par ce schéma initial (1 pt)
Donnez le schéma relationnel correspondant à la Fig. 75,
sous forme simplifiée (Nom de table, liste des attributs
en encadrant les clés primaires et en soulignant les clés étrangères) (1 pt)
Quelles sont les différences entre le schéma initial et le schéma final ? À quelle(s)
évolution(s) des choix de modélisation ce changement correspond-t-il (2 pts) ?
Dessinez le schéma final sous forme entité-association. Quelles dépendances fonctionnelles ont changé
par rapport au schéma initial ? (1 pt)
Dans le schéma final, une réification serait-elle possible? Quels changements impliquerait-elle ? (1 pt)?
Donnez les commandes createtable pour le schéma final (2 pts)
Chaque entité définit une DF de la clé vers les attributs, et chaque association plusieurs-un
définit une DF entre les clées. Donc : \(idOpérateur \to nom\) ;
\(idForfait \to nom, prix, idOpérateur\) ;
\(idClient \to nom, prénom, ville, numéro, durée, idForfait\)
Dans le schéma initial, un client peut prendre un seul forfait, d’où
la DF \(idClient \to idForfait\). Dans le schéma final un client peut prendre
plusieurs forfaits (mais pas plusieurs fois le même), avec donc plusieurs numéros.
Voir Fig. 76. Une nouvelle clé est définie par
l’association plusieurs-plusieurs, avec la DF \(idClient, idForfait \to durée, numéro\)
En réifiant l’association plusieurs-plusieurs, on attribuerait un identifiant propre
à la souscription, et un même client pourrait prendre plusieurs fois le même forfait,
ce qui n’est pas possible dans le schéma final. Dans une « vraie » base, ce serait sans
doute souhaitable.
Classique. La table ``Souscription` est typique d’une association plusieurs-plusieurs.
On obtient tous les clients de Nantes, et leurs forfaits. Si un client n’a aucun forfait, une ligne
est produite quand même, avec le nom du forfait à null.
Une application met en contact des personnes dont certaines (les professeurs)
proposent des leçons en ligne à d’autres (les étudiants).
Dans ce qui suit on va supposer ques les leçons sont des cours de langue.
Au départ le concepteur a placé les données sur les leçons
dans un unique fichier CSV
dont voici un extrait du contenu sous forme de tableau.
idProf
professeur
idEtudiant
étudiant
langue
date
1
Luca
2
Philippe
italien
14 mars
2
Philippe
3
Lydia
français
15 mars
1
Luca
3
Lydia
italien
20 mars
2
Philippe
3
Lydia
français
2 avril
1
Luca
3
Lydia
italien
6 avril
3
Lydia
2
Philippe
anglais
12 avril
3
Lydia
2
Philippe
allemand
13 avril
On va chercher à faire mieux avec une base relationnelle.
Pour chacune des DFs suivantes, indiquez si elle est respectée ou pas
dans le tableau précédent. Si elle ne l’est pas, expliquez pourquoi.
\(professeur \to langue\)
\(professeur, date \to etudiant\)
\(etudiant \to professeur\)
\(etudiant, langue \to professeur\)
Correction
\(professeur \to langue\) : non, car on voit que Lydia enseigne l’anglais et l’allemand
\(professeur, date \to etudiant\) : oui, pas de contre-exemple dans le tableau (mais on en trouverait sans doute en continuant à accumuler les exemples)
\(etudiant \to professeur\), non, Philippe suit des cours avec Luca et Lydia
\(etudiant, langue \to professeur\) : oui, pour une langue donnée, chaque étudiant n’a qu’un seul professeur
Finalement, après avoir étudié beaucoup plus d’exemples, on
détermine les dépendances fonctionnelles suivantes:
\(idProf \to professeur\), \(idEtudiant \to etudiant\) et
\((idProf, idEtudiant, date) \to langue\).
Quelle est la clé de la relation ?
Quelle est la décomposition en 3FN ?
Correction
Quelle est la clé de la relation ? C’est le triplet \((idProf, idEtudiant, date)\)
Quelle est la décomposition en 3FN ? On applique la
normalisation et on trouve 3 relations : Professeur (id, nom),
Etudiant (id, nom) et Cours(idProf, idEtudiant, date, langue).
Il est clair qu’il est préférable de fusionner les tables Professeur et Etudiant.
Pour la suite de l’examen nous travaillons avec le schéma suivant.
Une des relations correspond-elle à une réification ? Si oui
indiquez ce que serait le schéma sans réification.
Correction
Clés étrangèrescodeLangueNatale, codeLangue, idProfesseur et idEtudiant dans Cours.
Standard
Standard
Réification : la relation Cours peut être interprétée comme venant d’une relation ternaire (Prof, Etudiant, Date), ce qui
donnerait une clé avec trois attributs sans réification (voir les DF ci-dessus).
Après réification, on a simplifié la clé, mais il faut prendre
garde à ce qu’un professeur ne donne pas deux cours au même moment (avec une clause unique).
Etudiez soigneusement le schéma et identifiez toutes les clés étrangères
qui font référence à la table Personne (1 pt)
Correction
Il y en a beaucoup : idPère, idMère, idEnfant et idPuericultrice.
Donnez les commandes SQL de création des tables suivantes :
Crèche, Personne et Inscription. Note : on peut ne pas connaître
le père ou la mère d’un enfant. (2 pts)
Voyez-vous une table résultant d’une réification ? Une table résultant d’une entité faible ?
Lesquelles ? (1 pt)
Correction
La table Inscription provient d’une entité faible : on voit que son
identifiant comprend l’identifiant d’un enfant, auquel elle est donc
indissolublement liée.
La table Demande résulte d’une réification.
Donnez le schéma Entité/association correspondant à ce schéma relationnel (2 pts)
Un enfant peut-il être inscrit à plusieurs crèches la même année ; un enfant peut-il demander
à s’inscrire dans plusieurs crèches la même année ? (1 pt)
Correction
Non, pas d’inscription d’un enfant la même année car la clé est constituée
de ces deux attributs. En revanche on peut demander une inscription dans plusieurs crèches pour une même année.
Si on ajoutait la dépendance fonctionnelle \(idPuéricultrice \to idCrèche\),
comment faudrait-il modifier le schéma pour qu’il reste en 3FN ? (1 pt)
Correction
Il faut d’abord réaliser que idPuéricultrice
est un alias pour idPersonne.
Il faut donc représenter la nouvelle dépendance fonctionnelle dans le schéma
en ajoutant la clé étrangère idCrèche dans la table
Personne (elle peut être à null pour toutes les
personnes qui ne sont pas puéricultrices).
On peut alors retirer idCrèche de la table Inscription puisque
la crèche est déterminée par la puéricultrice.
Je veux donner la liste de tous les enfants nés en 2022, avec le nom
de leur puericultrice s’ils sont inscrits à une crèche, et null
sinon. Donnez la requête SQL.
Correction
Il faut penser dans ce cas à effectuer une jointure externe.
Indiquez les demandes en cours pour l’année 2024 : celles pour lesquelles il existe une
demande de l’enfant à une crèche, mais pas d’inscription. Donnez simplement
l’identifiant de l’enfant et l’identifiant de la crèche.
Quelles sont les crèches n’ayant pas rempli toutes leurs places
en 2024 (autrement dit le nombre d’inscriptions est inférieur à la capacité)?
Aide : faites une première requête affichant le nombre d’inscriptions
et la capacité. Puis ajoutez la clause indiquant que le premier doit
être inférieur au second.
On implante une procédure d’inscription qui effectue les étapes suivantes :
On parcourt les demandes des enfants qui ne sont pas encore inscrits
Pour chaque demande on vérifie qu’il reste de la place dans la crèche demandée
Si oui, on crée le nuplet dans la table Inscription
Procédure inscription()
begin
demandes_en_cours=(résultat requête 5)for each demande in demandes_en_cours doplaces_restantes=(résultat requête 7)
si (places_restantes > 0)
Insérer inscription
end for
end
On met en place un système d’information sur les structures administratives françaises:
régions, départements, préfectures.
Voici le schéma de la base sur laquelle nous allons travailler.
Les clés primaires sont en gras, les clés étrangères ne sont pas indiquées.
Département (codeDpt, nom, préfecture, population, codeRégion, idPrésident)
Voisins (codeDpt1, codeDpt2)
Dans les tables Région et Département, préfecture désigne
la ville siège de la préfecture de région ou de département. Strasbourg
est à la fois préfecture de la région Grand Est et du département
du Bas-Rhin. Dans la même région, Colmar est préfecture du département du Haut-Rhin.
Régions et départements sont présidés par une personne.
Deux départements sont voisins s’ils ont une frontière commune.
On ajoute la commande suivante au schéma de la table Voisins
check(codeDpt1<codeDpt2)
Quelle est à votre avis la motivation de cette contrainte?
Correction
Il existe une symétrie dans la notion de voisin: si A
est voisin avec B, B est voisin avec A. Pour éviter le doublon
de représentation (voisin(A, B) et voisin(B,A)), on décide
de n’autoriser que le premier, d’où la clause check.
Donner le schéma entité-association correspondant à ce schéma relationnel.
Correction
Standard
Existe-t-il une association plusieurs-plusieurs dans ce schéma? Si oui
vous paraîtrait-il judicieux de la réifier? Justifiez votre réponse.
Correction
Voisins provient d’une association plusieurs-plusieurs.
La contrainte sur la clé implique qu’un département ne peut pas
être deux fois le voisin d’un autre. C’est une contrainte tout à fait
raisonnable, voire indispensable. La réification est donc inutile.
Une même personne peut-elle présider plusieurs départements?
Peut-elle présider un département et une région?
Correction
Réponse oui aux deux questions: aucune contrainte de clés
n’empêche ces situations.
Notons D le département, P la personne,
ND le nom du département et NP le nom de la personne. Le schéma
nous donne les dépendances fonctionnelles suivantes: D->P,ND
et P->NP.
On ajoute la dépendance P->D. Comment l’interpréter
et que devient le schéma relationnel?
Correction
La dépendance additionnelle indique qu’une personne ne
peut diriger qu’un seul département. L’identifiant d’une
personne pourrait donc servir à identifier un département.
Ce ne serait cependant pas un très bon choix car la personne
dirigeant un département est amenée à changer régulièrement.
En pratique, mieux vont donc déclarer dans le schéma
une contrainte d’unicité sur l’identifiant idPrésident
dans la table Département (c’est également une clé étrangère).
Dans toute la suite de l’examen, on travaille sur
le schéma donné dans l’énoncé, et en supposant que la contrainte
sur l’ordre des codes de département est respectée dans la table Voisins
(donc, codeDpt1<codeDpt2).
Comment caractériseriez-vous le contenu de \(V_3\)?
Donnez la commande SQL de création de la vue \(V_3\).
Soit le département de code \(d_1\). Quelle
requête algébrique
sur \(V_3\) donne les codes de tous ses voisins (expliquer).
Correction
\(V_1\) est donc un synonyme de la table Voisins,
et \(V_2\) a le même contenu que \(V_1\)mais
l’ordre des clés est inversé. On ne trouve dans
\(V_2\) que les paires de département (d1,d2)
tels que d1>d2. D’où la réponse aux questions:
\(V_1 \cap V_2\) est vide
\(V_3\) contient toutes les paires de départements voisins
(d1,d2) et (d2,d1). Autrement dit, chaque relation de
voisinage entre deux départements est représentée dans les deux sens.
On peut donc créer la vue suivante qui pourra nous
simplifier les requêtes SQL par la suite.
Qui préside (prénom, nom) la région contenant le département “Cantal”?
Quelles villes sont à la fois préfecture de région et d’un
département de plus de 100000 habitants (donner le nom de la ville, du département, et l’intitulé de la région).
Quels sont les départements voisins du Cantal ? (Aide: et si vous utilisiez la vue V3 définie précédemment?)
Quels départements d’une même région sont voisins l’un de l’autre?
Donnez l’intitulé de la région et les noms des deux départements.
Attention à bien prendre en compte la contrainte sur les clés
dans Voisins
Quelles régions n’ont pas de département?
Quelles personnes ne président ni région ni département?
Donner, pour chaque région, le nombre de département et sa population totale (obtenue
par cumul de celle des départements)
Dans la requête précédente, que se passe-t-il si une
région n’a pas de département? Comment réussir
à afficher le nom de la région avec la valeur 0 pour le nombre
de départements dans ce cas?
selectd2.nomasvoisinCantalfromDépartementasd1,Départementasd2,V3asvwhered1.nom='Cantal'/* On sait que dans V3, on trouve chaque voisinage représenté dans les deux sens */andv.codeDpt1=d1.codeDptandv.codeDpt2=d2.codeDpt
Sinon, solution SQL complète avec un “ou” logique. Plus compliqué…
selectd2.nomasvoisinCantalfromDépartementasd1,Départementasd2,Voisinsasvwhered1.nom='Cantal'and(/* Cas d'un voisin de code supérieur au Cantal */(d1.codeDpt<d2.codeDptandv.codeDpt1=d1.codeDpt1andv.codeDpt2=d2.codeDpt)or/* Cas d'un voisin de code inférieur au Cantal */(d1.codeDpt>d2.codeDptandv.codeDpt1=d2.codeDptandv.codeDpt2=d1.codeDpt))
selectr.intitulé,d1.nomasnomDpt1,d2.nomasnomDpt2fromRégionasr,Départementasd1,Départementasd2,Voisinsasvwherer.codeRégion=d1.codeRégionandr.codeRégion=d2.codeRégion/* Pour prendre la relation 'voisins dans le bon sens' */andd1.codeDpt<d2.codeDptandv.codeDpt1=d1.codeDptandv.codeDpt2=d2.codeDpt
Les régions sans département apparaissent dans le résultat de la jointure avec une
valeur à null pour la population, et le count appliqué à null
renvoie 0 (tandis que le sum appliqué à null
renvoie null).
Soit les attributs TGVER avec les dépendances fonctionnelles suivantes:
\(TG \to E\); \(R \to G\); \(E \to G\).
Quelle est la clé?
Quel est le résultat de l’algorithme de normalisation?
Ce résultat est-il en troisième forme normale?
Correction
Tous les attributs qui n’apparaissent pas à droite sont nécessairement
dans la clé, donc T, V et R. On vérifie aisément que TVR est une clé
(la seule).
On a donc les relations (TGE) et (RG), auxquelles il faut ajouter la clé
(TVR) (algorithme de normalisation).
Le résultat est en troisième forme normale, si l’on admet une petite extension:
dans la relation TGE, la DF E -> G n’a pas la clé pour partie gauche. Mais on ne peut
pas décomposer plus sans perdre d’information. C’est un cas (très rare en pratique) où il
faut admettre une définition de la 3FN un peu plus compliquée que celle donnée en cours.
Essayons de modéliser un système qui permet d’emprunter
un réseau de transport en comptabilisant les passages. Le réseau
est organisé en lignes desservant plusieurs stations,
chaque station peut être commune
à plusieurs lignes (ce qui permet des changements).
Les abonnés ont une carte
qu’ils valident à l’entrée dans une station et à la sortie
dans une autre, ce qui
constitue un trajet.
Un concepteur propose le schéma suivant;
les clés primaires sont en gras.
Aurait-on pu choisir comme clé de la table Trajet
la paire d’attributs (idAbonné,idStationDépart)?
Donnez vos arguments pour ou contre
un tel changement.
Le schéma permet-il de savoir par quelles lignes est
passé un abonné pendant un trajet?
Donnez les commandes SQL de création des tables Ligne, Station
et DétailLigne. Notez que dans l’esprit du concepteur,
tous les attributs de DétailLigne
sont not null.
Indiquez comment exprimer la contrainte suivante:
deux abonnés différents ne peuvent pas avoir le même
numéro de mobile.
Qu’est ce qui caractérise la tête d’une ligne (sa première station) et son terminus?
Aide: réflechissez aux valeurs (ou absences de valeur) possibles de l’attribut idStationSuivante
dans la table DétailLigne.
Quel est d’après vous le schéma entité-association
correspondant à ce schéma relationnel?
On ajoute des informations relatives aux conducteurs, chaque conducteur étant
affecté chaque jour à une ligne. On identifie les dépendances fonctionnelles suivantes:
\[\begin{split}matriculeConducteur \to nom, pr\acute{e}nom \\
matriculeConducteur, jour \to idLigne\end{split}\]
Quelles sont les modifications apportées au schéma relationnel?
Correction
L’attribut idAbonné, idLigne et les trois attributs idStation
Non, cela reviendrait à imposer qu’un abonné parte d’une station une seule fois, et ce n’est
vraiment pas raisonnable…
Non, on connaît les stations de départ et d’arrivée pour un trajet, mais la station
ne détermine pas la ligne.
Le numéro de mobile est une clé candidate: on ajoute la contrainte unique(noMobile)
La tête d’une station est caractérisée par le fait que l’id de la station n’est pas une
des idStationSuivante pour la même ligne; le terminus est une station dans DétailLigne
est la valeur de idStationSuivante qui n’est
pas idStation pour la même ligne.
La table DétailLigne ne représente la séquence
des stations que dans un seul sens.
Par exemple, DétailLigne contient la
séquence des stations entre Balard et Créteil,
mais pas celle des stations entre Créteil et Balard.
Or, il est bien entendu
possible de parcourir une ligne dans les deux sens.
Créer une vue BiDirection montrant
la séquence des stations d’une ligne dans les
deux sens possibles.
En déduire la requête qui donne les
deux stations immédiatement connexes à la station République,
sur la ligne “Ligne 8” (c’est son intitulé).
Correction
La vue est l’union des séquences de stations
dans DétailLigne et des séquences inversées.