Jeanne et Serge
[30 minutes]
Vous avez en charge la réalisation d'une base de données pour gérer un tournoi de Volley-Ball. Les équipes, identifiées par un nom, sont composées de deux à six joueurs identifiés par leur prénom (étant donnée l'équipe à laquelle ils appartiennent). Un match oppose deux équipes, à une date donnée et toujours renseignée, dont une est gagnante, et sont joués en deux sets gagnants (le score est donc toujours de 2 pour le gagnant et 0 ou 1 pour le perdant, on décide donc de ne gérer que le score du perdant). On notera que deux équipes se rencontrent au plus une fois.
Question
Réaliser le modèle conceptuel de la BD en utilisant le formalisme UML. Énoncer les éventuelles contraintes non représentées sur le schéma.
Solution
Contraintes supplémentaires :
Les deux équipes impliquées dans l'association Match sont différentes.
Une équipe de la relation Match gagne et l'autre perd.
Question
Traduire le MCD en modèle logique relationnel. Énoncer les éventuelles contraintes non représentables en relationnel.
Solution
Team (#teamName:string)
Player (#firstName:string, #team=>Team(teamName))
Match (#winner=>Team(teamName), #looser=>Team(teamName), date:date, score:integer) WITH (score < 2)
Contraintes supplémentaires :
Les attributs
Match.winner
etMatch.looser
ont des valeurs différentes.L'attribut
Match.score
vaut 0 ou 1.2 à 6 joueurs composent une équipe.
Question
Proposer une implémentation SQL du modèle relationnel, en intégrant le maximum de contraintes. Énoncer les éventuelles contraintes non représentables en SQL.
Solution
CREATE TABLE Team (
teamName VARCHAR PRIMARY KEY
) ;
CREATE TABLE Player (
firstName VARCHAR,
team VARCHAR REFERENCES Team(teamName),
PRIMARY KEY (firstName, team)
) ;
CREATE TABLE Match (
winner VARCHAR REFERENCES Team(teamName),
looser VARCHAR REFERENCES Team(teamName),
date date NOT NULL,
score INTEGER CHECK (score < 2),
PRIMARY KEY (winner, looser),
CHECK (winner <> looser)
) ;
Contrainte supplémentaire :
2 à 6 joueurs composent une équipe.
Question
Écrivez en algèbre relationnel l'expression permettant de sélectionner les équipes ayant gagné au moins un match et perdu au moins un match.
Solution
R1 = Projection (Match, Match.winner)
R2 = Projection (Match, Match.looser)
R = Jointure (R1, R2, R1.winner = R2.looser)
ou
R1 = Projection (Match, Match.winner)
R2 = Projection (Match, Match.looser)
R = Intersection (R1, R2)
Question
Écrire une requête SQL permettant de lister toutes les équipes ayant gagné un match, avec leur nombre de points (un match gagné valant 2 points et un match perdu 0 point), triées par leur nombre de points (avec l'équipe ayant le plus de points en premier).
Solution
SELECT M.winner, COUNT(M.winner)*2 AS points
FROM Match M
GROUP BY M.winner
ORDER BY points DESC ;