Université Paris Diderot – L2 Informatique 1er juillet 2015 Bases de Données (BD3) – Examen Session 2 (durée : 3 heures) Documents autorisés : trois feuilles A4 recto-verso et personnelles. Les ordinateurs et les téléphones mobiles sont interdits. Le barême est donné à titre indicatif et pourra être réévalué afin de favoriser la majorité des étudiants. Exercice 1 [Requêtes SQL et algébre relationnelle (2-3 points)] On considère les trois tables suivantes : Vendeur Livre id_vend nom_vend ville Chronopost point_relais retrait_magasin V1 Temps-Livres Lyon 9 2 oui V2 Un regard moderne Paris 8 4 oui V3 Gibert Joseph Paris 6 4 oui V4 Joseph Gilbert Paris 20 10 non ISBN titre auteur editeur format nb_pages 2070360539 Le cycle de Fondation, I : Fondation Asimov Folio broché 416 2070396401 Le Cycle de Fondation, I à V - coffret Asimov Folio broché 2608 2277217395 Le Congrès de futurologie Lem J’ai Lu poche 158 9782702100 Le Congrès de futurologie Lem Calmann-Levy broché 222 Exemplaire id_ex E1 E1 E2 E1 E1 E1 E1 E1 ISBN 2070396401 2070396401 2070396401 2277217395 2277217395 2070360539 2070360539 9782702100 id_vend V2 V3 V3 V1 V2 V1 V3 V4 état 1 2 3 2 1 1 2 3 prix 28 32 15 66 56 8 12 72 Donnez les résultats des requêtes suivantes : 1. πtitre (σauteur=‘Asimov0 (Livre) ./ σid_vend=‘V 40 (Exemplaire)) 2. πediteur (σauteur=‘Lem0 (Livre)) − πediteur (σf ormat=‘poche0 (Livre)) 3. SELECT id_vend, AVG(prix) FROM Exemplaire WHERE état >= 2 GROUP BY id_vend HAVING sum(prix) = 72 ; 4. SELECT V.nom_vend FROM Vendeur V WHERE NOT EXISTS (SELECT L.auteur FROM Livre L, Exemplaire E WHERE L.ISBN=E.ISBN AND auteur=‘ASIMOV’ AND E.id_vend=V.id_vend); 1 Exercice 2 [Requêtes SQL et algébre relationnelle (10-12 points)] On considère une base de données de livres d’occasion proposés à la vente par différents vendeurs. Les clefs primaires sont précédées d’une étoile (*) et les clefs étrangères sont suivies d’un astérisque (#). • Vendeur(*id_vend, nom_vend, ville, Chronopost, point_relais, retrait_magasin) : liste des différents vendeurs, avec leur localisation géographique, ainsi que leur politique de facturation en matière de frais de port (identifiant ; nom ; ville ; frais d’envoi par Chronopost en euros ; frais d’envoi en point relais en euros ; possibilité de retrait gratuit en magasin : oui ou non). • Livre(*ISBN, titre, auteur, editeur, format, nb_pages) : liste des livres (identifiant ISBN ; titre ; auteur ; éditeur ; format, au choix : poche, broché, relié ; nombre de pages). • Exemplaire(*id_ex, *ISBN#, *id_vend#, état, prix) : liste de chacun des exemplaires de livres proposés à la vente par les différents vendeurs (la clef primaire est composite et est formée à partir d’un identifiant d’exemplaire, ainsi que d’un identifiant de livre et d’un identifiant de vendeur ; l’attribut état consiste en une note de 1, 2 ou 3 qui représente respectivement un état “comme neuf”, “bon” ou “correct” ; le prix correspond à une somme ronde en euros). Le premier attribut correspond au fait qu’un même vendeur peut proposer à la vente plusieurs exemplaires d’un même ouvrage. Lorsqu’il vous est demandé dans la question 2 de donner une requête en algèbre relationnelle, pour plus de lisibilité, vous pouvez écrire la requête en plusieurs étapes, par exemple : A = πval (R) ./ S B = σatt=5 (T ∪ R) reponse = A ∩ B Par ailleurs, si vous avez besoin de distinguer deux utilisations d’une même table, vous pouvez utiliser un numéro pour distinguer les deux utilisations de la table. Voici un exemple, dans lequel la table T est utilisée deux fois : C = σatt=5 (T1 ./T1 .val<>T2 .val T2 ) A défaut de répondre à la question 2 avec des requêtes en algèbre relationnelle, vous pouvez proposer des requêtes SQL (et vice versa, lorsque cela est possible, i.e., pour les requêtes de la question 1 qui ne font pas appel à l’aggrégation). Sachez néanmoins que dans ce cas, seule la moitié des points vous sera comptée. 1. Ecrivez les requêtes SQL correspondant aux questions suivantes. Un bonus sera accordé si vous prenez bien soin d’éviter les doublons. (a) Les titres des livres dont le nombre de pages est supérieur à 1000 et qui sont proposés pour moins de 15 euros par un vendeur acceptant le retrait gratuit en magasin. Tableau résultat : titre, nom_vend, prix. (b) Le nombre de livres différents (on compte un livre par ISBN) écrits par Asimov et dont le titre contient le mot “Fondation”. Tableau résultat : nombre. 2 (c) Le(s) livre(s) le(s) moins cher(s) parmi ceux proposés par les vendeurs acceptant le retrait gratuit en magasin. Tableau résultat : titre, id_vend, prix. (d) Pour chaque vendeur, le nombre d’exemplaires en stock correspondant aux livres dont l’ISBN est “9782702100” et dont l’état a une note d’au plus 2 (i.e., l’état de l’exemplaire est soit “comme neuf”, soit “bon”). Tableau résultat : nom_vend, nb_ex. (e) Les paires de vendeurs qui proposent au moins un livre en commun (par “livre”, nous entendons ici deux ouvrages dont l’ISBN est identique). Tableau résultat : V1.nom_vend, V2.nom_vend. Suggestion : vous pouvez utiliser des alias de table. (f) Les vendeurs qui proposent tous les livres de Lem présents dans la base de données. Tableau résultat : nom_vend. Suggestion : vous pouvez utiliser une sous requête corrélée ou bien la condition “having”. (g) Les éditeurs n’ayant édité aucun livre de plus de 500 pages présent dans la base, ni aucun livre proposé dans la base pour plus de 30 euros. Tableau résultat : editeur. 2. Ecrivez en algèbre relationnelle les requêtes correspondant aux questions suivantes. (a) Les auteurs dont au moins un des ouvrages est vendu pour plus de 100 euros, ainsi que le nom des auteurs qui ont été édités par “La Pléiade”. Tableau résultat : auteur. (b) Le nom des vendeurs proposant des livres dont l’envoi par Chronopost revient à moins de 10 euros (prix + frais d’envoi par Chronopost). Tableau résultat : nom_vend, titre. (c) Les auteurs dont aucun livre n’est proposé en format relié. Tableau résultat : auteur. (d) Les livres dont seulement un unique exemplaire se trouvant dans l’état 1 est proposé dans la base. Tableau résultat : nom_vend, ISBN. Suggestion : il pourra ici vous être utile soit de distinguer deux utilisations d’une même table avant d’en considérer le produit cartésien, soit d’utiliser le renommage. Exercice 3 [Modélisation, normalisation et langage de définition de données (5-7 points)] Dans cet exercice on considère la base de l’exercice 2. 1. On suppose que le type de l’attribut “état” est INTEGER. Les contraintes de clef primaire et étrangère listées dans l’exercice 2 ne suffisent pas à garantir que les valeurs de cet attribut sont bien comprises entre 1 et 3. Expliquez comment vous pouvez imposer ce type de contrainte lors de la création de vos tables en SQL. 2. Proposez un autre schéma que celui de l’exercice 2, construit cependant à partir du même ensemble d’attributs et pouvant donner lieu à des anomalies de suppression, insertion, ou bien mise à jour (veillez à pointer ces anomalies et en particulier à pointer de possibles problèmes de redondances). 3 3. On souhaite incorporer à notre base de données un certain nombre d’informations concernant la langue d’origine des ouvrages, ainsi que, éventuellement, la langue dans laquelle ils ont été traduits, avec le nom du traducteur et sa note (représentée par un entier de 1 à 3 correspondant à un nombre d’étoiles : plus un traducteur a d’étoiles, meilleur il est). Chaque langue est associée à un alphabet. On souhaite également classer les ouvrages par thème et année de parution. Vous pouvez évidemment aussi reprendre le schéma de la question 2 afin de l’améliorer à votre convenance (e.g., introduire un identifiant, un attribut nom et un attribut prénom distincts pour chaque auteur, etc.). (a) Proposez une première modélisation dans laquelle à chaque traducteur correspond un unique couple langue source langue cible. (Si un traducteur traduit de l’anglais vers le français on considère par exemple qu’il ne traduit ni du français vers l’anglais, ni de l’italien vers l’anglais, ni du russe vers le chinois.) Chaque traducteur reçoit une note unique évaluant ses compétences pour cet unique couple langue source langue cible. Expliquez bien vos choix de modélisation. (b) Proposez une seconde modélisation plus libérale permettant à un traducteur de traduire plus ou moins bien dans plusieurs langues différentes (et, éventuellement, depuis plusieurs langues différentes). Précisez bien vos choix (vous pouvez décider qu’à un même traducteur correspond une seule langue source, ou bien qu’il peut traduire depuis plusieurs langues sources). Chaque traducteur reçoit donc une note différente évaluant ses compétences pour chaque couple langue source langue cible lui correspondant. Expliquez bien vos choix de modélisation. 4. Proposer deux schémas correspondant respectivement à chacune de vos deux modélisations. Vous veillerez à éviter autant que possible les valeurs nulles. Vos schémas devront également être dans l’une des deux formes normales vues en cours (FNBC ou 3FN). Précisez les dépendances fonctionnelles que vous souhaitez satisfaire (par exemple, dans le cas de l’exercice 2, un ISBN détermine un titre, un auteur, un éditeur et un nombre de pages) et expliquez pourquoi vos schémas sont bien dans l’une et/ou l’autre forme. Il n’est pas nécessaire de fournir le code SQL nécessaire à la création de vos tables (vous pouvez les présenter en utilisant les mêmes conventions que celles dont il est fait usage dans l’exercice 2). Exercice 4 [Normalisation (bonus - 2 points)] On rappelle qu’on utilise pour désigner un ensemble de la forme {A, B} l’abbréviation AB. On considère l’ensemble d’attributs R = {N, S, C, T } (où N correspondant à un nom de traducteur, S à une langue source, C à une langue cible et T à un tarif) et l’ensemble de dépendances fonctionnelles F = {N → SC, C → N T, S → T }. 1. Calculer la clôture de chacun des trois ensembles N , C et ST . 2. Lister toutes les clefs candidates. 4