Bonjour,
Histoire d’y voir plus clair, affichons votre MCD et votre MLD.
MCD
Quelques commentaires sur ce MCD :
1) La patte connectant l’entité-type CASSE et l’association-type Participer est porteuse d’une cardinalité minimale 0. Cela veut dire qu’il peut exister des casses pour lesquels on n’a pas encore identifié les participants. Est-ce bien ce que le MCD veut exprimer ?
2) La patte connectant l’entité-type BANDIT et l’association-type Participer est porteuse d’une cardinalité minimale 1. Cela veut dire qu’à terme la base de données ne recensera que les bandits ayant participé à des casses. Est-ce bien ce que le MCD veut exprimer ?
3) La modélisation des séjours en prison est correcte, mais sera à aménager au niveau du MLD si on ne veut pas partir dans la mise en œuvre de contraintes nécessaires à la bonne santé de la base de données (par exemple, Louis ne peut pas être en même temps à Fresnes et à La Santé, etc.) et une rédaction compliquée des requêtes (cf. B.3). En effet, on a là un exemple de gestion de données datées, à savoir
en cours d’une part (Louis est actuellement en prison) et
historisées d’autre part (Louis a purgé plusieurs peines à La Santé et en d’autres lieux). Mais bon, on fera avec ce MCD et le MLD qui en est dérivé.
MLD
Venons-en à vos requêtes.
Vous écrivez :
1) Quels sont les bandits table bandit et table participer?
Quel est le sens de cette phrase incompréhensible ?
Vous écrivez :
T1= jointure(bandit,participer) T1(numbandit,nombandit,numcasse)
Il faudrait que vous fournissiez un minimum d’explications quant aux opérateurs et à la syntaxe. Si vos notations sont basées sur une grammaire donnée, merci de fournir le lien vers celle-ci.
Ainsi, qu’est-ce que T1 ? Le résultat d’une « jointure » ? Pourquoi T1 figure deux fois sur la même ligne ?
Que veut dire « T1(numbandit,nombandit,numcasse) » ?
Le terme « jointure » symbolise-t-il l’opération d’équijointure ? De jointure naturelle ? De thêta-jointure ?
Vous écrivez :
T2=sélection(T1,numcasse=251) T2(numbandit,nombandit,251)
Je ne vois aucun rapport entre ces expressions et la question posée.
Concernant la question 2 :
2) nom et matricule du commissaire
Que vient faire le casse 543 ? Est-ce à dire que la question posée est en fait la suivante :
Quel est le nom et quel est le matricule du commissaire chargé de l’enquête concernant le casse pour lequel la valeur de l’attribut Numcasse dans l’en-tête de la table CASSE est égal à 543 ?
Passons à la question B.1 :
Liste des bandits arrêtés par le commissaire Bond (MATRICULE = 007) : NUMBANDIT, NOMBANDIT, DATE-ARRESTATION
Les informations demandées figurent dans la table BANDIT (attributs NUMBANDIT et NOMBANDIT), ainsi que dans la table ARRETER (attributs NUMBANDIT, DATE_ARRESTATION et MATRICULE). Il y a donc à prévoir une jointure naturelle à laquelle participent ces deux tables, ainsi qu’une restriction (ce que vous appelez une sélection) pour se limiter aux arrestations auxquelles a procédé le commissaire de matricule 007, puis une éventuelle projection sur les attributs NUMBANDIT, NOMBANDIT, DATE_ARRESTATION comme l’a fait CinePhil.
Dans le style impératif, on peut procéder ainsi (voyez la formulation d’Oishiiii) :
1) Restriction des lignes de la table ARRETER, pour lesquelles le prédicat MATRICULE = '007' est VRAI.
2) Jointure
naturelle des tables ARRETER et BANDIT, afin de récupérer les lignes concernant les bandits correspondants.
3) Projection sur les attributs à faire figurer dans le résultat : NUMBANDIT, NOMBANDIT, DATE_ARRESTATION.
Je vous renvoie à l’annexe B de l’article
Bases de données relationnelles et normalisation dans lequel je rappelle la notation des opérateurs relationnels dans le style de Tutorial D.
Toujours dans le style impératif et en Tutorial D, on formalise ainsi ce qui précède :
1 2 3 4
| WITH
ARRETER WHERE MATRICULE = '007' AS T1,
T1 JOIN BANDIT AS T2 :
T2 {NUMBANDIT, NOMBANDIT, DATE_ARRESTATION} ; |
Si vous préférez le style déclaratif :
((ARRETER WHERE MATRICULE = '007') JOIN BANDIT) {NUMBANDIT, NOMBANDIT, DATE_ARRESTATION} ;
Vous pouvez aussi utiliser le style SQL, comme l’a fait CinePhil.
Maintenant, si vous avez une grammaire spécifique, à vous d’adapter.
A noter : dans la jointure naturelle des tables ARRETER et BANDIT, seul l’attribut MATRICULE est utile en ce qui concerne la table ARRETER. Dans ces conditions, vous pouvez utiliser la semi-jointure (opérateur SEMIJOIN), c'est-à-dire ne retenir de la table BANDIT que les lignes qui ont leur contrepartie dans la table ARRETER. Ainsi, on peut remplacer :
1 2 3 4
| WITH
ARRETER WHERE MATRICULE = '007' AS T1,
T1 JOIN BANDIT AS T2 :
T2 {NUMBANDIT, NOMBANDIT, DATE_ARRESTATION} ; |
Par :
1 2 3 4
| WITH
ARRETER WHERE MATRICULE = '007' AS T1,
BANDIT SEMIJOIN T1 AS T2 :
T2 {NUMBANDIT, NOMBANDIT, DATE_ARRESTATION} ; |
Mais attention, les termes BANDIT et T1 doivent impérativement figurer respectivement à gauche et à droite de l’opérateur SEMIJOIN. Dans le cas contraire, ce sont les lignes de T1 qui sont retenues et pas celle de BANDIT.
Passons à la question B.2 :
Liste des NUMCASSE, DESIGN-CASSE, DATE-CASSE, VILLE-CASSE ET TYPE-CASSE auxquels a participé Jo MAGNUM (NUMBANDIT = 532)
La table CASSE est partie prenante à cause des attributs NUMCASSE, DESIGN-CASSE, DATE-CASSE, VILLE-CASSE ET TYPE-CASSE. La table PARTICIPER est aussi partie prenante, à cause des attributs NUMCASSE et NUMBANDIT.
Comme dans l’exemple précédent, on peut procéder ainsi :
1) Restriction des lignes de la table PARTICIPER, pour lesquelles le prédicat NUMBANDIT = '532' est VRAI.
2) Jointure naturelle (ou semi-jointure) des tables PARTICIPER et CASSE.
3) Projection sur les attributs à faire figurer dans le résultat : NUMCASSE, DESIGN-CASSE, DATE-CASSE, VILLE-CASSE ET TYPE-CASSE.
Je vous laisse formaliser.
Passons à la question B.3 :
Quels sont les séjours que P'tit Louis de NUMBANDIT = 999 a effectués en prison : DATE_DEBUT, DATE_FIN, NOMPRISON
Dans l’état de votre MCD (donc de votre MLD), la solution est loin d’être triviale. Dans un premier temps, il faut comparer les lignes de la table DEBUTER_SEJOUR avec celle de la table FINIR_SEJOUR, pour lesquelles NUMBANDIT = '999' et on a égalité sur les attributs NOMPRISON et NUMBANDIT (comme dans le cas d’une jointure naturelle), mais pour lesquelles on vérifie en plus l’inégalité DATE_DEBUT < DATE_FIN, sachant qu’au résultat de cette vérification, il faudra retenir chaque ligne pour laquelle la date de fin est la plus ancienne (utilisation de l’opérateur d’agrégation MIN), car Louis a pu faire plus d’un séjour dans la même prison.
Dans le style de Tutorial D :
1 2 3 4 5 6 7 8 9 10 11 12
| WITH
((DEBUTER_SEJOUR RENAME NUMBANDIT AS BANDIT_A,
NOMPRISON AS PRISON_A)
TIMES
(DEBUTER_SEJOUR RENAME NUMBANDIT AS BANDIT_B,
NOMPRISON AS PRISON_B))
WHERE BANDIT_A = '999'
AND BANDIT_A = BANDIT_B
AND PRISON_A = PRISON_B
AND DATE_DEBUT < DATE_FIN AS T1,
MIN (T1, DATE_FIN) AS T2 :
T2 {DATE_DEBUT, DATE_FIN, PRISON_A} ; |
On a traité ici de l’historique des séjours. Reste à traiter la partie qui concerne les personnes actuellement en détention (pas évident...)
En SQL (a priori complet, à CinePhil de vérifier...) :
1 2 3 4 5 6 7
| SELECT A1.NUMBANDIT, A1.NOMPRISON, A1.DATE_DEBUT, Min(B1.DATE_FIN) as DATE_FIN
FROM DEBUTER_SEJOUR AS A1 LEFT JOIN FINIR_SEJOUR AS B1
ON A1.NOMPRISON = B1.NOMPRISON
AND A1.NUMBANDIT = B1.NUMBANDIT
AND A1.DATE_DEBUT < B1.DATE_FIN
WHERE A1.NUMBANDIT >= '999'
GROUP BY A1.NUMBANDIT, A1.NOMPRISON, A1.DATE_DEBUT ; |
Passons à la question B.4 :
Liste des bandits qui se sont évadés de la prison de Nîmes : NUMBANDIT, NOMBANDIT, DATE_EVASION
On peut procéder ainsi :
1) Restriction sur l’attribut EVASION : FINIR_SEJOUR WHERE EVASION = 'OUI',
2) Jointure naturelle des tables FINIR_SEJOUR et BANDIT,
3) Projection sur les attributs NUMBANDIT, NOMBANDIT, DATE_FIN (que l’on peut renommer en DATE_EVASION).
Je vous laisse le soin de la rédaction.
Passons à la question B.5 :
Liste des NOMPRISON et NOMDIRECTEUR des prisons où il y a eu au moins une évasion
1) Restriction sur l’attribut EVASION : FINIR_SEJOUR WHERE EVASION = 'OUI',
2) Jointure naturelle des tables PRISON et FINIR_SEJOUR,
3) Projection sur les attributs NOMPRISON et NOMDIRECTEUR.
Passons à la question B.6 :
Quels sont les "amis" de Jack Dalton (NUMBANDIT = 631)
Pas de panique, il s’agit d’une auto-jointure. Faites comme s’il y avait deux tables BANDIT.
1) Restriction sur la table BANDIT,
2) Jointure naturelle de BANDIT et de BANDIT (ce qui suppose de renommer les attributs ne servant pas dans la jointure proprement dite),
3) Projection sur les attributs voulus.
Partager