Chapitre 14 Bases de données
Transcription
Chapitre 14 Bases de données
Chapitre 14 Bases de données I Présentation Notre société utilise de plus en plus de données et un des enjeux de l’efficacité économique mais aussi de la démocratie est d’en maîtriser l’exploitation. Il n’est pas raisonnable d’écrire individuellement un programme d’accès aux données car les différents problèmes sont cruciaux et demandent beaucoup d’attention : • • • • • • structuration des données rapidité d’accès gestion des autorisations d’accès priorités d’accés sauvegarde des modifications gestion des pannes ... Depuis 1970 deux modèles abstraits de structure des données et d’extraction ont été étudiés : l’algèbre relationnelle et le calcul relationnel. Ils sont prouvés comme équivalents et ont servi de base théorique aux logiciels de base de données que les progrès de l’informatique ont permis d’écrire de manière efficace. Nous allons étudier l’un de ces modèles : l’algèbre relationnelle. Les bases de données sont articulées sous la forme client-serveur : l’utilisateur travaille sur un poste (client) qui peut être éloigné de l’ordinateur qui gère les données (serveur). Il est nécessaire de permettre un dialogue entre ces deux parties. 1 2 Client SQL Serveur Une normalisation a permis d’unifier le langage utilisé dans les bases de données : SQL. Ce langage permet d’unifier les différents systèmes du point de vue des utilisateurs. Bien entendu la programmation en interne de ces gros logiciels dépend de l’éditeur (Oracle, SAP, IBM, Microsoft, ...) Nous allons en étudier les principales fonctions en commençant par les bases simples (ou plates) puis en étudiant ce qui fait l’intérêt des bases, le croisement de données. On peut remarquer que ce langage n’est en fait pas visible pour les usagers. En effet l’utilisation des bases de données se fait maintenant à travers une architecture trois-tiers. Entre l’usager et la base de données se place l’application qui travaille au dessus du gestionnaire de bases de données. Client Client interface html Application SQL Serveur Client Le chapitre finit par une courte présentation de la conception d’une base de données avec les fonctions SQL utiles à l’écriture de cette base. Nous ne verrons qu’une toute petite partie de ce domaine très important car il induit la rapidité et la facilité d’emploi des bases. 3 II Structure II.1 Tableau Le modèle utilisé est relativement simple : c’est celui d’un tableau à deux dimensions que nous avons tous souvent rencontré. On regroupe plusieurs formulaires qui donnent tous les mêmes informations sur les objets : • répertoire (nom, téléphone, adresse, ...) • fiche de bibliothèque (auteur, titre, année, pagination, ...) • livre d’état-civil des naissances (père, mère, nom, lieu, ...) • ... Et on les représente dans un tableau, par exemple dans un tableur. Nous ferons le choix que les données des différents éléments sont en ligne et que les informations sont alignées par colonne. Voici un exemple simple dont nous nous servirons. Ce sont les vainqueurs des élections présidentielles. nom de Gaulle de Gaulle Pompidou Giscard d’Estaing Miterrand Miterrand Chirac Chirac Sarkozy Hollande II.2 prénom Charles Charles Georges Valery François François Jacques Jacques Nicolas François études D_G année Saint-Cyr D 1958 Saint-Cyr D 1964 ENS Ulm D 1969 X D 1974 Droit G 1981 Droit G 1988 ENA D 1995 ENA D 2002 Droit D 2007 ENA G 2012 résultat 78,5 55,2 58,2 50,8 51,8 54,0 52,6 82,2 53,0 51,6 Vocabulaire • Les différents titres de colonnes sont appelés attributs. On notera formellement A1 , A2 , . . . , Ap les attributs. • L’ensemble des valeurs possibles d’un attribut A est son domaine Dom(A). • Chaque ligne s’appelle un n-uplet (ou tuple en anglais). C’est donc un élément de Dom(A1 ) × Dom(A2 ) × · · · × Dom(Ap ). Une structure de donnée élémentaire, appelée schéma relationnel ou plus simplement relation, est déterminée par un ensemble fini et fixé d’attributs et de leur domaines (le sort de la relation) et l’ensemble des tuples (l’extension de la relation). 4 II.3 Contraintes On va reprendre certaines phrases énoncées ci-dessus et en tirer des conséquences. Certaines de ces conséquences devront être assurées par l’utilisateur d’autres seront contrôlées par le logiciel. Définition 14.1. Les attributs forment un ensemble • Il n’y a pas d’attribut en double : il ne peut être question qu’il y ait deux attributs de même nom, ils risqueraient d’être affectés de valeurs différentes dans des tuples. • L’ordre des attributs n’est pas fixé : on ne parle pas du premier attribut mais de l’attribut nom (par exemple). • Les différentes données ne sont donc pas vraiment des tuples, ce sont plutôt des fonctions depuis l’ensemble des attributs vers l’union des domaines avec la condition que t[Ai ] appartient au domaine Ai (remarquer que l’on écrit avec des crochets plutôt que des parenthèses). • On peut alors restreindre une ligne à un sous-ensemble d’attributs : t[A4 , A5 , A2 ]. Si S est une partie de {A1 , A2 , . . . , Ap } on notera t[S] l’ensemble des valeurs prises par le tuple t pour les attributs appartenant à S. Définition 14.2. Les lignes forment un ensemble • Il n’y a pas de ligne en double : si t[A1 , . . . , Ap ] = t0 [A1 , . . . , Ap ] alors t = t0 ; cela correspond à l’aspect fonction des tuples. • L’ordre des lignes n’est pas fixé. Bien entendu une présentation des données dans un tableau aura un ordre des attributs et un ordre des tuple mais ces ordres de présentations sont le résultats des choix de l’utilisateur ou de l’ordre physique des données. II.4 Clés La contrainte de non-répétition des tuples est très importante ; la répétition de données induirait des problème de rapidité d’accès et fausserait les calculs. Pour cela les bases de données réelles contiennent un concept de clé qui doit être pensé dès la conception des bases de données. On verra qu’il a aussi une grande importance lors de l’utilisation de relations multiples. Définition 14.3. Une super-clé d’une relation r est un ensemble S d’attributs tel que ∀t, t0 ∈ R t[S] = t0 [S] ⇒ (t = t0 ) En raison de la contrainte d’ensemble pour les lignes l’ensemble de tous les attributs est toujours une super-clé. Dans l’exemple ci-dessus {année}, {nom, résultat}, {prénom, année} sont des super-clés. 5 Définition 14.4. Une clé candidate d’une relation r est une super-clé de taille minimale (pour l’inclusion). K est donc une clé candidate si 1. K est une super-clé 2. Pour tout K 0 inclus dans K, K 0 n’est pas une super-clé. Une super-clé qui ne contient qu’un seul attribut est toujours une clé candidate. • {nom, résultat} n’est pas une clé primaire. • {année} est une clé primaire. • Lorsque vous vous identifiez sur un site sur lequel vous êtes inscrit, l’identifiant + le mot de passe est une clé candidate. Définition 14.5. Parmi les clés candidates on en choisit une : c’est la clé primaire Pour indiquer la clé primaire on souligne les attributs correspondants dans la table. Indiquer au système une clé primaire pour chaque table permet une indexation des données à l’aide de cette clé, ce qui renforce l’efficacité des procédures d’interrogation de la table. Dans la pratique on évitera les clés primaires qui ne seraient primaires que "par accident" : on pourrait insérer des données supplémentaires qui feraient perdre le caractère primaire des clés. Pour cela on introduira un attribut, souvent nommé id, dans la définition de la relation qui sera un entier qu’on incrémentera à chaque ajout d’un tuple. Ce sera la clé primaire. idElec nom 1 de Gaulle 2 de Gaulle 3 Pompidou 4 Giscard d’Estaing 5 Miterrand 6 Miterrand 7 Chirac 8 Chirac 9 Sarkozy 10 Hollande prénom Charles Charles Georges Valery François François Jacques Jacques Nicolas François études D_G Saint-Cyr D Saint-Cyr D ENS Ulm D X D Droit G Droit G ENA D ENA D Droit D ENA G année résultat 1958 78,5 1964 55,2 1969 58,2 1974 50,8 1981 51,8 1988 54,0 1995 52,6 2002 82,2 2007 53,0 2012 51,6 Nous connaissons déjà ce genre d’attributs : numéro de sécurité sociale, plaque minéralogique, numéro de série . . . 6 III Algèbre relationnelle simple L’algèbre relationnelle sert à formaliser les questions que l’on peut poser à une relation ou, comme plus tard, à un ensemble de relation. Elle exprime ce que l’on fait ; le calcul relationnel exprime ce que l’on veut. III.1 Définition L’algèbre relationnelle est un ensemble d’opérateurs que l’on peut appliquer à des relations, et dont le résultat est une relation. Comme le résultat est toujours une relation on pourra combiner les opérateurs : on forme ainsi, à partir d’opérateurs élémentaires, des requêtes élaborées. L’objectif est de pouvoir exprimer toute manipulation raisonnable par une expression algébrique des opérateurs élémentaires. Exemples : • quels sont les présidents de droite ? • quels sont les présidents qui sortent de l’ENA ? • quels présidents ont gouverné plus de 10 ans ? III.2 Opérateurs ensemblistes Un premier type d’opérateur combine 2 relations qui ont le même schéma ; on les utilisera surtout pour assembler les résultats d’autres requêtes. r et r0 sont deux relations ayant le même schéma (c’est-à-dire les mêmes attributs). 1. r ∪ r0 est la relation de même schéma dont les tuples sont ceux qui appartiennent à r ou à r0 . 2. r ∩ r0 est la relation de même schéma dont les tuples sont ceux qui appartiennent à r et à r0 . 3. r \ r0 est la relation de même schéma dont les tuples sont ceux qui appartiennent à r mais pas à r0 . III.3 Opérateurs spécifiques Les opérateurs étudiés ici sont ceux qui utilisent la structure des relations. Dans ce chapitre nous n’étudions que les opérateurs unaires, qui s’appliquent à une relation unique. Par exemple la question “Quels sont les présidents qui sortent de l’ENA ?” se traduit par : donner les noms (projection) des présidents dont les études se sont passées à l’ENA (sélection). 7 1. La SELECTION (ou restriction) consiste à ne garder que les tuples qui vérifie une propriété. On note σF (r) la relation extraite de r avec les mêmes attributs dont les tuples vérifient la propriété F . n o σF (r) = t ∈ r ; F (t) Les propriétés élémentaires sont de la forme P θ Q où θ un opérateur de comparaison (=, <, ≤, >, ≥) et P et Q des expression construites à partir des attributs et des constantes avec des fonctions usuelles. Une propriété composée avec des connecteurs logiques correspond à des unions et intersections et peut être écrite directement. Par exemple σF et F 0 (r) = σF (r) ∪ σF 0 (r). On utilisera donc des conditions composées. Exemple : F est la condition “prénom = François”, σF (r) est la relation idElec nom prénom 5 Miterrand François 6 Miterrand François 10 Hollande François études D_G année Droit G 1981 Droit G 1988 ENA G 2012 résultat 51,80 54,0 51,6 2. La PROJECTION consiste à ne garder qu’une partie des attributs. On note πX (r) la relation extraite de r avec les mêmes tuples restreints à l’ensemble X. n o πX (r) = t[X]; t ∈ r Exemple : X est l’ensemble {prénom ,nom, résultat}, nom prénom résultat de Gaulle Charles 78,5 de Gaulle Charles 55,2 Pompidou Georges 58,2 Giscard d’Estaing Valery 50,8 πX (r) est la relation Miterrand François 51,8 Miterrand François 54,0 Chirac Jacques 52,6 Chirac Jacques 82,2 Sarkozy Nicolas 53,0 Hollande François 51,6 8 Comme la projection doit être une relation les lignes ne sont pas répétées : études Saint-Cyr ENS Ulm si X={étude}, πX (r) donne Polytechnique Fac de droit ENA 3. Le RENOMMAGE consiste à renommer un attribut. Ce sera utile lors de produits de tables lorsque deux tables ont des attributs portant le même nom mais correspondent à des données différentes. Si A ∈ R où R est le sort de r et B 6∈ R on peut renommer A en B : n ρA→B (r) = t ; ∃s ∈ r, t[B] = s[A], ∀C ∈ R \ {A}, t[C] = s[C] IV IV.1 o SQL De quoi parle-t-on ? La présentation des bases de données qui a été faite correspond à une abstraction. Dans la pratique chaque éditeur d’un logiciel de gestion de base de données organise les données afin d’optimiser leur accès. En général ces données sont stockées à distance et l’utilisateur envoie des requêtes pour obtenir les informations souhaitées : c’est l’architecture clientserveur. Dans la pratique il existe souvent un programme intermédiaire entre l’utilisateur et les données : c’est l’architecture trois tiers (3 intervenants). Dans le cas de l’architecture client-serveur (et aussi entre le tiers intermédiaire et le serveur de données) il s’est produit un événement inhabituel : une norme universelle a été établie qui permet d’écrire des requêtes de la même façon quel que soit le logiciel : c’est SQL, pour Structured Query Langage. Ce langage reprend la structure de l’algèbre relationnelle en y ajoutant des moyens de calculs et autres améliorations. Il le fait dans une formulation plus proche d’un langage humain (l’anglais) en structurant les requêtes dans un modèle simple. Bien entendu chaque éditeur optimise les questions pour donner des réponses le plus rapidement possible, ajoute des améliorations supplémentaires mais presque tous contiennent le langage tel qu’il est normalisé. 9 IV.2 Syntaxe Les représentations des relations se font avec le modèle du tableau. En SQL on parlera de • tables à la places de relations • colonnes à la places d’attributs • lignes à la places de tuples. La forme générale d’une requête en SQL est SELECT x1,x2,. . .,xp FROM table WHERE condition ; 1. Les mots-clés de SQL sont usuellement écrits en majuscule mais ce n’est pas obligatoire. 2. SELECT correspond à la projection, les attributs ou colonnes à afficher sont énumérés et séparés par une virgule. Si on ne veut pas effectuer de projection, on garde toutes les colonnes en signalant * qui signifie "tout". Il y a toujours une projection. Ce caractère * permet donc d’obtenir tous les noms des colonnes. 3. WHERE correspond à la sélection (attention au faux-ami, la sélection n’est pas SELECT). La condition peut être composée à l’aide des connecteurs logiques AND, OR ou NOT. Les comparateurs sont =, >, <, >=, <=, !=. Les chaînes de caractères sont entourées de guillemets simples. La clause WHERE est facultative. On peut ne pas faire de sélection. 4. FROM sélectionne le nom de la table à utiliser. Cela deviendra plus signifiant lorsqu’on utilise plusieurs tables. 5. On peut renommer une colonne avec AS ou même en juxtaposant le nouveau nom à droite de l’ancien. 6. Un requête se termine par un point-virgule. 7. Si on veut combiner plusieurs requêtes on peut les assemble avec UNION, INTERSECT ou EXCEPT mais il est plus simple de combiner les conditions. 10 Exemple : quels sont les noms et prénoms des présidents ayant été élus avant 1970 ou étant passés par l’ENA ? La question en algèbre relationnelle s’écrit πnom,prénom σannée<1970 (r) ∪ πnom,prénom σétudes=EN A (r) SELECT nom,prénom FROM présidents WHERE année < 1970 En SQL cela se traduit directement par UNION SELECT nom,prénom FROM présidents WHERE études=’ENA’ ; SELECT nom,prénom ou, plus simplement FROM présidents WHERE année < 1970 OR études=’ENA’ ; nom prénom de Gaulle Charles de Gaulle Charles Dans tous les cas on obtient Pompidou Georges Chirac Jacques Chirac Jacques Hollande François SQL ne respecte pas la contrainte d’unicité des lignes. Si on veut éviter les redondances il faut ajouter DISTINCT à SELECT : nom prénom SELECT DISTINCT nom,prénom de Gaulle Charles FROM présidents donne Pompidou Georges WHERE année < 1970 OR études=’ENA’ ; Chirac Jacques Hollande François 11 V V.1 Statistiques Fonctions Les résultats d’une requête seront souvent utilisés ensuite, par exemple à des fins statistiques. SQL contient la possibilité de faire quelques uns de ces calculs. Les fonctions disponibles (de base) sont 1. le comptage, c’est-à-dire le nombre de lignes : COUNT 2. le maximum des éléments dans une colonne : MAX 3. le minimum des éléments dans une colonne : MIN 4. la somme des éléments d’une colonne : SUM 5. la moyenne des éléments d’une colonne (sum/count) : AVG Le résultat est un nombre, pas une table, que l’on peut utiliser comme valeur. Si f est une de ces fonctions on l’emploie sous la forme SELECT f(ligne) FROM table WHERE condition ; Exemples 1. La moyenne des scores SELECT AVG(resultat) FROM elections donne 58,79 2. Il y a eu deux résultats "hors normes", l’élection de De Gaulle en 1958 par un collège de grands électeurs et l’élection de Chirac en 2002 face à Le Pen. SELECT AVG(resultat) FROM elections WHERE resultat <70 ; donne 54 3. Un résultat de fonction est un nombre SELECT nom, année,resultat FROM elections WHERE resultat < (SELECT AVG(resultat) FROM elections WHERE resultat <70) ; 12 nom Giscard d’Estaing Miterrand donne Chirac Sarkozy Hollande V.2 année resultat 1974 50,8 1981 51,8 1995 52,6 2007 53,0 2012 51,6 Agrégats Avec les fonctions on est sorti du cadre de l’algèbre relationnelle car on ne crée pas une nouvelle table. Cependant on peut utiliser ces fonctions en regroupant les données par paquets pour obtenir une nouvelle table. Si f est une fonction, X est un ensemble d’attributs d’une relation r et A un attribut n’appartenant pas à X on note, pour chaque tuple t0 de valeurs de X, f (t0 , A) la valeur de la fonction f appliquée à l’attribut A pour la relation σt[X]=t0 (r) c’est-à-dire à l’ensemble des tuples qui prennent les valeurs t0 pour les attributs de X. On introduit une nouvelle opération, l’agrégation notée X γf (A) (r). X γf (A) (r) n o = t ; ∃s ∈ r, t[X] = s[X], t[A] = f s[X], A En pratique : on regroupe la relation selon les valeurs des attributs de X et on calcule f (A) pour tous les ensembles de lignes définies par ces regroupements. D_G resultat D 61,5 D_G γmoyenne(resultat) (r) donne G 52,5 Dans SQL on regroupe les données par GROUP BY colonne1, colonne2, . . ., colonnep après l’éventuelle clause WHERE. Il faut indiquer les colonnes regroupées aussi dans la clause SELECT qui contiendra aussi l’attribut calculé. SELECT D_G, AVG(resultat) La requête ci dessus s’écrit FROM elections GROUP BY D_G ; Autre exemple : calcul des moyennes des résultats des mandats. SELECT nom, AVG(resultat) AS moyenne FROM elections GROUP BY nom ; 13 nom de Gaulle Pompidou Giscard d’Estaing Miterrand Chirac Sarkozy Hollande moyenne 66,9 58,2 50,8 52,9 67,4 53,0 51,6 On peut toujours filtrer avant les regroupements (en amont) : nom de Gaulle SELECT nom, AVG(resultat) AS moyenne Pompidou FROM elections Giscard d’Estaing WHERE D_G =’D’ Chirac GROUP BY nom ; Sarkozy moyenne 66,9 58,2 50,8 67,4 53,0 On peut aussi filtrer après les regroupements (en aval), quand le filtre porte sur les valeurs calculées, avec HAVING placé à la fin. La syntaxe est la même que pour WHERE. SELECT nom, AVG(resultat) AS moyenne nom moyenne FROM elections Pompidou 58,2 WHERE D_G =’D’ Giscard d’Estaing 50,8 GROUP BY nom Sarkozy 53,0 HAVING moyenne < 60 ; 14 VI VI.1 Jointure dans l’algèbre relationnelle Introduction Ce qui précède décrit ce qui peut se faire avec un tableur évolué. Dans ce cadre on considère un unique formulaire qui doit contenir tout ce qui est pertinent. On risque alors la redondance des informations et la non fiabilité des répétions. On va maintenant étudier l’utilisation simultanée de plusieurs tables. Exemple On utilisera un exemple simple de 4 tables concernant le groupe de musique électronique, Tangerine Dream. 1. une table Musiciens de SORT (idMusicien, nom, prénom) idMusicien nom prénom 1 Froese Edgar 2 Schulze Klaus 3 Schnitzler Conrad 2. une table Disques de SORT (idDisque, titre, année) idDisque titre 1 Electronic Meditation 2 Alpha Centauri 3 Zeit année 1970 1971 1972 3. une table Instruments de SORT (idMusicien,instrument) idMusicien instrument 1 Claviers La clé primaire est {idMusicien,instrument} 1 Guitare 1 Synthés 4. une table JoueDans de SORT (idMus,idDis) idMus idDis 1 1 La clé primaire est {idMus,idDis} 1 2 1 3 15 VI.2 Produit Le premier moyen d’assembler deux relations est d’en faire le produit cartésien. Définition 14.6. Produit de deux relations 1. Si r est une relation de sort R 2. si r0 est une relation de sort R0 3. si R et R0 sont disjoints alors le produit de r net r0 est la relation r × ro0 de sort R ∪ R0 définie par r × r0 = u ; u[R] ∈ r, u[R0 ] ∈ r0 Exemple : Musiciens × Disques idMusicien nom prénom idDisque titre 1 Froese Edgar 1 Electronic Meditation 1 Froese Edgar 2 Alpha Centauri 1 Froese Edgar 3 Zeit année 1970 1971 1972 Tous les musiciens sont associés à tous les disques. La condition R ∩ R0 = ∅ n’est pas très contraignante, il suffit de renommer les noms des attributs ; en général on notera r.nom tous les attributs de r et r’.nom tous les attributs de r0 pour éviter les homonymies. On pourrait imaginer aplatir tout ensemble de tables en en faisant le produit : le principal inconvénient est la taille qu’on obtiendrait, très lourde, et donc le temps nécessaire aux recherche et modification. De plus chaque modification devrait se faire sur un grand nombre de tuples. VI.3 Division Il existe une fonction réciproque du produit, la division, dans l’algèbre relationnelle. Définition 14.7. Division de deux relations 1. Si r est une relation de sort R 2. si r0 est une relation de sort R0 3. si R0 ⊂ R0 alors la division de r par r0 est la relation r ÷ r0 de sort R \ R0 définie par n r ÷ r0 = u ; ∀t0 ∈ r0 , (u, t0 ) ∈ r o C’est l’ensemble des tuples sur R \ R0 que l’on peut prolonger sur R avec tous les tuples de r0 en obtenant toujours un tuple de r. On a (r × r0 ) ÷ r0 = r et (r ÷ r0 ) × r0 ⊂ r. 16 VI.4 Jointure naturelle Cependant il est utile d’avoir des tables différentes qui réfèrent à des objets identiques, dans ce cas l’identifiant de l’objet peut être le même dans les deux tables. La contrainte d’ensemble des attributs impose alors qu’un produit ne répète pas deux colonnes identiques : on parle alors de jointure naturelle. Définition 14.8. Jointure naturelle 1. Si r est une relation de sort R 2. si r0 est une relation de sort R0 3. si R = R1 ∪ R3 et R0 = R2 ∪ R3 avec R1 et R2 disjoints alors la jointure naturelle de r et r0 est la relation r ./ r0 de sort R ∪ R0 définie par n r ./ r0 = u ; u[R] ∈ r, u[R0 ] ∈ r0 o Exemple : Musiciens ./ Instruments idMusicien 1 1 1 nom prénom instrument Froese Edgar claviers Froese Edgar guitare Froese Edgar synthés La colonne idMusicien n’est pas répétée. Seuls les instruments joués par un musicien sont associés à celui-ci. Alors que le produit Musiciens × Instruments aurait donné idMusicien nom prénom idMusicien instrument 1 Froese Edgar 1 claviers 2 Schulze Klaus 1 claviers 3 Schnitzler Conrad 1 claviers Les deux colonnes idMusiciens correspondent ici aux attributs des deux tables (ils sont supposés distincts). Klaus Schulze ne joue pas de clavier dans le disque de Tangerine Dream auquel il a participé. Il y a deux cas particuliers • si R ∩ R0 = ∅ on retrouve le produit • si R = R0 on retrouve l’intersection 17 VI.5 Jointure La jointure n’est, d’un point de vue algébrique, qu’une abréviation : on sélectionne dans le produit. Définition 14.9. Jointure 1. Si r est une relation de sort R 2. si r0 est une relation de sort R0 3. si R et R0 sont disjoints 4. si F est une condition portant sur R ∪ R0 alors la jointure de r et r0 selon F est la relation r ./F r0 de sort R ∪ R0 définie par r ./F r0 = σF (r × r0 ) Exemple : pour associer les artistes avec les identifiants des disques on calcule Musiciens ./F joueDans où F est le filtre idMusicien = idMus idMusicien nom prénom idMus idDis 1 Froese Edgar 1 1 1 Froese Edgar 1 2 1 Froese Edgar 1 3 Remarquer que les identifiants égaux apparaissent dans deux colonnes. Si on veut le titre des disques il faut une double jointure : (Musiciens ./F joueDans) ./F 0 Disques, où F 0 est idDis = idDisque Pour éviter lesidentifiants on projette : πnom,prénom,titre (Musiciens ./F joueDans)./F 0 Disques nom prénom titre Froese Edgar Electronic Meditation Froese Edgar Alpha Centauri Froese Edgar Zeit Si F est la condition triviale vrai on retrouve le produit. Si on considère que les noms des attributs d’une relation r sont r.A au lieu de A alors la jointure naturelle pourrait sembler un cas particulier de jointure où la condition F est la conjonction (liaison par ET) des égalités r.Ai = r0 .Ai pour les attributs Ai appartenant à R ∩ R0 . Cependant il faut noter qu’alors les colonnes égales sont répétées : la jointure naturelle est plus . . .naturelle. 18 VII VII.1 Tables multiples dans SQL Produit La traduction du produit en SQL est très simple il suffit d’énumérer les différentes tables dans la clause FROM. SQL considère les noms des colonnes sous la forme table.nom, il n’y a pas de noms identiques. Cependant, lors de l’affichage, le titre ne sera que nom et on peut croire que la contrainte d’ensemble n’est pas respectée. S’il n’y a pas d’ambiguïté il n’est pas nécessaire de donner le nom de la table. Un appel simple comme nom instrument SELECT nom,instrument Joliffe claviers FROM Musiciens,Instruments donne Joliffe claviers WHERE nom="Joliffe" ; Joliffe claviers on obtient tous les instruments (répétés) joués par tous les musiciens, ce n’est en général pas ce que l’on souhaitait. Pour obtenir le résultat attendu, les instruments joués par S. Joliffe, il faut filtrer à l’aide des identifiants : SELECT m.nom,i.instrument nom instrument FROM Musiciens AS m, Instruments AS i donne Joliffe claviers WHERE nom="Joliffe" Joliffe synthés AND m.idMusicien = i.idMusicien ; On pourra remarquer qu’on a renommé les tables pour ne pas avoir à écrire leur nom en entier. De plus il est utile de préfixer tous les champs même non ambigus afin de rendre lisible leur table d’origine. VII.2 Jointure naturelle Dans l’exemple ci-dessus la condition m.idMusicien = i.idMusicien est une condition d’identification, on est dans la cas d’une jointure naturelle. Cette dernière s’écrit NATURAL JOIN SELECT i.instrument FROM Musiciens m NATURAL JOIN Instruments i WHERE m.nom="Joliffe" ; On pourra remarquer que le renommage peut se faire sans le mot-clé as. 19 VII.3 Division La division n’est pas définie dans SQL, si on pouvait l’effectuer cela signifierait qu’on a très mal défini les tables. VII.4 Jointure La traduction de la jointure en SQL est table1 JOIN table2 ON condition Bien que cela soit possible il n’est pas recommandé de placer toutes les sélections dans la clause ON à la place de la clause WHERE. Le premier intérêt des jointures est de structurer plus clairement les requêtes. On écrira donc le plus souvent des équi-jointures : • les conditions d’égalité entre des colonnes de tables différentes sont placées dans la clause ON • les autres conditions sont placées après WHERE On retrouve ainsi une structure semblable à la jointure naturelle. Exemple : quels sont les musiciens qui jouent dans Phaedra ? SELECT m.nom, m.prénom FROM (Musiciens AS m JOIN joueDans as j ON m.idMusicien =j.idMus) JOIN Disques AS d ON j.idDis=d.idDisque WHERE d.titre = "Phaedra" ; nom Froese Franke Baumann prénom Edgar Christopher Peter La jointure est associative on peut aussi écrire SELECT m.nom, m.prénom FROM Musiciens m JOIN joueDans j JOIN Disques d ON m.idMusicien =j.idMus AND j.idDis=d.idDisque WHERE d.titre = "Phaedra" ; 20 VIII Création de bases VIII.1 Modèle entité-relation On va traiter un exemple : la gestion des livraisons dans un entrepôt c’està-dire les arrivées de marchandises, objets livrés par un transporteur depuis un fournisseur avec une date de livraison et une quantité. On commence par définir les entités, objets uniques qui ont des caractéristiques communes 1. On va créer une table d’entreprise, fournisseurs ou transporteurs réunis, qui contiendra les caractéristiques fixes. Il est inutile de créer deux tables différentes car elles contiendraient les mêmes attributs. entreprise(idEntreprise,nom,adresse,téléphone) 2. On crée ensuite une table des objets : objet(idObjet,dénomination,poids,volume) Comme le prix est susceptible de varier on ne l’indique pas. On se place dans la cas simple où une pièce donnée ne peut être produite que par une entreprise, par exemple en donnant des identifiants distincts à des pièces semblables selon leur origine. On doit donc ajouter l’identifiant de l’entreprise dans les attributs : objet(idObjet,dénomination,poids,volume,idEntreprise) 3. On va considérer les livraisons comme des entités abstraites : livraison(idLivraison,date,idTransporteur) On définit ensuite les associations entre ces entités. Ce sont des tables sans clé primaire créée, ce sera l’ensemble des identifiants des entités associées. Ici on va associer les objets et les livraisons par une table contient(idLivraison,idObjet,quantité,prixTotal) Il n’est pas utile de donner plus de renseignements (entreprise fournisseur, poids total, volume, . . .) car ils se calculent à partir des données fournies. Toute redondance augmente les risques d’erreurs donc d’incohérence. VIII.2 SQL Jusqu’à présent nous avons utilisé la partie de SQL qui manipule les données : DML pour Data Manipulation Language. On va ici utiliser une autre partie, de création de bases, DDL pour Data Definition Language. Il faut signaler que nous ne voyons qu’une petite partie des instructions, que ce soit pour la manipulation ou pour la création. 21 VIII.2.a Création d’une base Le programme SQL (SQLite, MySQL, . . .) ne s’ouvre qu’en l’appelant avec une base de données. Si celle-ci n’existe pas encore il la crée automatiquement. Un interface graphique permet de créer une base, en fait elle redémarre le programme. VIII.2.b Création des tables Pour créer une table il faut en énumérer les attributs en leur donnant un type, comme pour les variables en python. Les types les plus courants sont • INTEGER, un entier • REAL, un réel • CHAR(n), une chaîne de n caractères exactement • VARCHAR(n), une chaîne de n caractères au plus Il faut aussi spécifier la clé primaire. Cela se fait en ajoutant la commande PRIMARY KEY à l’attribut concerné CREATE TABLE entreprise( idEntreprise INTEGER PRIMARY KEY, nom VARCHAR(20), adresse VARCHAR(20), téléphone VARCHAR(14)) ; Si un ensemble d’attributs définit la clé primaire on écrit cette contrainte après les définitions des attributs. La commande PRIMARY KEY ne doit apparaître qu’une fois. CREATE TABLE contient( idLivraison INTEGER, idObjet INTEGER, quantité INTEGER, prixTotal REAL, PRIMARY KEY(idLivraison,idObjet)) ; VIII.2.c Clé étrangère L’utilisation efficace de la jointure demande qu’existent des identifiants égaux dans plusieurs tables. Il faut donc signaler qu’un attribut réfère à un attribut dans une autre table et que sa valeur doit exister dans cette autre table. Le logiciel de base de données se chargera des vérifications. Dans la pratique les tables qui décrivent 22 des entités auront une clé primaire sous la forme d’une unique colonne d’identifiant et les tables qui décrivent les associations feront référence à ces attributs : on donnera le nom de clé étrangère à ces colonnes. On peut donc ajouter une telle contrainte par FOREIGN KEY (attribut) REFERENCES autreTable (autreTable.attribut) CREATE TABLE contient( idLivraison INTEGER, idObjet INTEGER, quantité INTEGER, prixTotal REAL, PRIMARY KEY(idLivraison,idObjet) FOREIGN KEY (idLivraison) REFERENCES livraison (idLivraison), FOREIGN KEY (idObjet) REFERENCES objet (idObjet) ; VIII.2.d Création des tuples On introduit les différents tuples par l’instruction INSERT INTO nomTable suivie de VALUE (valeur1,. . .,valeurp) ; On peut rentrer plusieurs tuples à la fois en les séparant par des virgules. Si l’ordre d’entrée des valeurs n’est pas celui de la définition des tableson doit préciser les colonnes après INTO nomTable. INSERT INTO entreprises VALUE (1,"Labelle vis",5 rue des Tonneaux 59435 CHETICHI","03.20.01.32.87"), (2,"Beau et gond à la fois",17 rue Jacques Brel 59345 CHENINLA","03.20.33.32.64") ; 23 IX SQLite manager Le logiciel choisi pour expérimenter les bases de données est SQLite. Il est disponible sur toutes les distribution (Windows, Mac et Linux), il est facile à utiliser. Pour obtenir une interface à son utilisation nous allons utiliser un plug-in de Firefox : SQLite manager. La première étape est d’avoir Firefox disponible. IX.1 Installation SQLite manager est un module complémentaire (en français) : on se place dans la page de ces modules dans Firefox : Dans cette page on fait une recherche, par exemple sur le mot SQLite Parmi les modules proposés on choisit SQLite manager que l’on installe, il faut ensuite redémarrer Firefox. 24 IX.2 Utilisation Pour lancer le module on le choisit dans le menu Outils Il se lance dans une fenêtre séparée. On choisit alors sa structure dans le menu Base de donnée (on s’y connecte). Dans l’onglet "Exécuter le SQL" on peut alors rentrer ses requètes que l’on exécute par "Exécuter les commandes SQL".