Bases de données et Systèmes transactionnels Dominique Laurent dominique.laurent@u-cergy.fr Tao-Yan Jen jen@u-cergy.fr
Plan du cours Introduction Modèle Entité/Association Langage SQL - ORACLE Architectures des SGBD relationnels Notion de transaction et problématique de la concurrence d'accès Contrôle
Bibliographie Georges Gardarin : Bases de données (Eyrolles 2003) Claude Delobel, Michel Adiba : Bases de données et systèmes relationnels (Dunod 1982) Garcia-Molina Hector, Jeff Ulmann, Jenifer Widom : Database Systems:The complete book (Prentice Hall 2008) Dominique Laurent : Relational Databases Wiley Encyclopedia of Electrical and Electronics Engineering (2004) http://depinfo.u-cergy.fr/~dlaurent/ressources/publi/ RELATIONAL%20DATABASES.pdf
Introduction Pourquoi les bases de données? Stocker l'information de manière persistante Permettre un accès aux données Facile : ne pas écrire de programmes compliqués Efficace : réponses aux requêtes rapides Sûr : persistance des données et confidentialité des données Multi-utilisateurs : gérer les accès concurrents aux données
Bref historique Constat : les systèmes de gestion de fichiers ne sont pas capables de répondre aux besoins Manque de visibilité globale des données Interrogation difficile Gestion de la confidentialité et de la concurrence d'accès insuffisante Années 60 : Méthodes de conception ou d'analyse Premiers logiciels Systèmes de Gestion de Bases de Données (SGBD ou DBMS)
Bref historique Premiers modèles de SGBD Hiérarchique : données organisées sous forme arborescente (DL1, IBM) Réseau : données organisées sous forme de graphes (TOTAL, IBM) Avantages / Inconvénients PLUS : Vision globale des données, efficacité, persistance MOINS : interrogation difficile, confidentialité et concurrence d'accès insuffisantes
Bref historique Modèle relationnel (Edgard Frank Codd, 1970) Basé sur la notion mathématique de relation Permet une étude théorique Avantages / Inconvénients PLUS : Vision globale des données, facilité d'interrogation, possibilité d'optimisation, meilleure confidentialité MOINS : implémentation difficile (les premiers SGBD relationnels datent des années 80, ce problème est maintenant résolu : ORACLE, MySQL, DB2, SQL Server,...)
Modèle Entité/Association Problème Etant donné une application décrite en langue naturelle par les futurs utilisateurs, comment déduire l'organisation des données? Procéder en deux étapes: Organisation logique (indépendamment de tout système ou langage informatique) Organisation physique (en termes du type de logiciel utilisé)
Modèle Entité/Association Modélise les données en utilisant deux concepts Les entités : une entité se réfère à un ensemble d' «objets» ayant les mêmes caractéristiques Les associations (ou relations) : expriment des liens entre les entités
Exemple Modéliser les données concernant les inscriptions des étudiants aux cours auxquels ils doivent assister et les enseignants assurant ces cours Trois entités : cours, étudiant, prof Deux liens décrivant Les inscriptions des étudiants Les enseignements assurés par les enseignants
Exemple (entités) Chaque entité a donc trois attributs : Entité étudiant : num_et, nom_et, adr_et Entité prof : num_p, nom_p, adr_p Entité cours : num_c, nom_c, niveau Les attributs soulignés sont les clés : Chaque étudiant individuel est reconnu par trois valeurs Deux étudiants distincts ne peuvent avoir le même numéro
Représentation des entités etudiant Num_et Nom_et Adr_et Nom de l entité Liste des attributs etudiant 123456 Dupont Cergy Un étudiant particulier caractérisé par ses valeurs sur les attributs
Exemples (liens) Lien etudiant-cours : plusieurs-plusieurs Un étudiant peut être inscrit à plusieurs cours Un cours a plusieurs étudiants Lien cours-prof : un-plusieurs Si un cours donné ne peut être assuré par deux enseignants distincts lien un-plusieurs (car un enseignant assure plusieurs cours) Lien un-un : modélise l'héritage
Représentation des liens etudiant prof Num_et Nom_et Adr_et Num_p Nom_p Adr_p m cours n inscrit n Num_c Nom_c Niveau 1 enseigne
Au niveau des données etudiant 123456 Dupont Cergy etudiant 134567 Durand Pontoise prof 234567 Durand Paris inscrit cours enseigne inscrit inscrit 00010 info DESS cours 00020 math DEUG enseigne
Lien un-un (is_a) Notion d'étudiant salarié pour lesquels on ajoute les attributs : salaire et horaires On crée une nouvelle entité etudiant-salarie ayant les trois attributs num_sal, salaire et horaire Un étudiant salarié hérite des attributs de l'entité étudiant possède en plus les trois attributs de l'entité etudiant-salarie
Représentation des liens is_a etudiant etudiantsalarie prof Num_et Nom_et Adr_et Is-a num_sal salaire horaire Num_p Nom_p Adr_p m cours n inscrit n Num_c Nom_c Niveau 1 enseigne
Au niveau des données etudiant 123456 Dupont Cergy etudiant 134567 Durand Pontoise Is-a etudiantsalarie 8910 1000 19h-23h prof 234567 Durand Paris inscrit cours enseigne inscrit inscrit 00010 info DESS cours 00020 math DEUG enseigne
Modèle relationnel Les seuls objets sont les relations ou tables Une table est définie par Un nom Un schéma (liste d'attributs) Des n-uplets (données) Exemple : les étudiants sont représentés par Nom de la table : etudiant Attributs : [num_et, nom_et, adr_et] N-uplets : (123456, Dupont, Cergy), (134567, Durand, Pontoise),...
Représentation d'une table etudiant nom Num_et Nom_et Adr_et schéma 123456 134567 Dupond Durand Cergy Pontoise n-uplets
Théorie du modèle relationnel Etude théorique des opérations permettant de manipuler les tables Niveau logique (pouvoir d'expression) Niveau algébrique (efficacité) Niveau pratique : le standard est SQL (Structured Query Language) Etude théorique de la conception du schéma d'une base (non abordé dans le cours)
Du modèle E/A aux tables Règles générales Toute entité donne lieu à une table ayant le même nom et les mêmes attributs Tout lien entre les entitités E1 et E2 est traduit par une table de même nom et dont les attributs sont Les attributs (éventuels) du lien Les clés des entités E1 et E2
Exemple Le schéma E/A se traduit par les tables etudiant[num_et, nom_et, adr_et] prof[num_p, nom_p, adr_p] cours[num_c, nom_c, niveau] inscrit[num_et, num_c] enseigne[num_c, num_p] Remarque : la table enseigne n'est pas nécessaire cours[num_c, nom_c, niveau, num_p]
Manipulation de tables : Algèbre relationnelle Opérations ensemblistes : union, intersection, différence Opérations relationnelles : Projection permet de restreindre les colonnes Sélection permet de restreindre les lignes Jointure permet de combiner deux tables Renommage permet de changer le nom d'un attribut
Exemples Noms et adresses des étudiants qui habitent Cergy Sélectionner sur l'adresse Projeter sur les attributs nom_et et adr_et Noms des enseignants qui enseignent les cours de bases de données Sélectionner dans la table cours tous les n-uplets tels que nom_c = 'bases de données' Joindre le résultat avec la table prof Projeter sur l'attribut nom_p
Langage SQL Conçu sur la base des opérations de l'algèbre relationnelle Offre des fonctionnalités supplémentaires Devenu le langage de définition des données et d'interrogation dans tous les SGBD relationnels Fait l'objet de standardisations SQL1 86 version minimale SQL1 89 addendum (intégrité) SQL2 (92) langage complet
SQL1 86 Langage de définition des données CREATE TABLE CREATE VIEW Langage de manipulation des données SELECT INSERT UPDATE DELETE Langage de contrôle des données GRANT et REVOKE BEGIN et END TRANSACTION COMMIT et ROLLBACK
Manipulation des données : requêtes Projection, sélection, jointure : SELECT [DISTINCT] <attributs de projection> FROM <relations à joindre> [WHERE <condition de sélection> [AND < conditions de jointure>]] DISTINCT élimine les répétitions La condition de jointure spécifie comment les tables sont jointes (sans condition, on effectue un produit cartésien)
Exemples de projection-sélection Noms et adresses de tous les étudiants SELECT nom_et, adr_et FROM etudiant Noms et adresses des étudiants qui habitent Cergy SELECT nom_et, adr_et FROM etudiant WHERE adr_et = 'Cergy'
Exemple de projection-sélection-jointure Noms des enseignants qui enseignent les cours de bases de données cours[num_c, nom_c, niveau, num_p] prof[num_p, nom_p, adr_p] La jointure doit être effectuée sur l'attribut num_p SELECT DISTINCT nom_p FROM cours, prof WHERE nom_c = 'bases de données' AND cours.num_p = prof.num_p
Exemple de projection-sélection-jointure Noms des enseignants qui enseignent les cours de bases de données Autre écriture en imbriquant deux SELECT SELECT DISTINCT nom_p FROM prof WHERE num_p IN (SELECT num_p FROM cours WHERE nom_c = 'bases de données')
Opérations ensemblistes Renvoie l'union/intersection/différence des résultats de deux requêtes Syntaxe (SELECT... FROM... WHERE...) UNION / INTERSECT / MINUS (SELECT... FROM... WHERE...) Les deux SELECT doivent porter sur les mêmes attributs
Exemple : Union Numéros des étudiants inscrits au cours 10 ou au cours 20 (SELECT num_et FROM inscrit WHERE num_c = 10) UNION (SELECT num_et FROM inscrit WHERE num_c = 20)
Exemple : Union Numéros des étudiants inscrits au cours 10 ou au cours 20 SELECT DISTINCT num_et FROM inscrit WHERE num_c = 10 OR num_c = 20 SELECT DISTINCT num_et FROM inscrit WHERE num_c IN (10, 20)
Exemple : Intersection Numéros des étudiants inscrits au cours 10 et au cours 20 (SELECT DISTINCT num_et FROM inscrit WHERE num_c = 10) INTERSECT (SELECT DISTINCT num_et FROM inscrit WHERE num_c = 20)
Exemple : Intersection Numéros des étudiants inscrits au cours 10 et au cours 20 : NE PAS ECRIRE SELECT DISTINCT num_et FROM inscrit WHERE num_c = 10 AND num_c = 20 La réponse à cette requête est VIDE Car aucun n-uplet ne peut avoir deux valeurs sur le même attribut!
Exemple : Différence Numéros des étudiants non inscrits au cours 10 (SELECT num_et on peut remplacer FROM inscrit) MINUS (SELECT num_et FROM inscrit WHERE num_c = 10) inscrit par etudiant
Exemple : Différence Numéros des étudiants non inscrits au cours 10 NE PAS ECRIRE SELECT num_et FROM inscrit WHERE num_c <> 10 Le résultat est les numéros des étudiants inscrits à un cours autre que le cours 10
Exemple : Différence Numéros des étudiants non inscrits au cours 10 SELECT num_et FROM etudiant WHERE num_et NOT IN (SELECT num_et FROM inscrit WHERE num_c = 10)
Pourquoi le renommage? Pouvoir considérer deux versions de la même table Exemple : numéros des étudiants inscrits à au moins deux cours distincts La méthode est : Joindre la table inscrit avec elle-même selon l'attribut num_et Sélectionner dans la jointure les n-uplets où le numéro d'étudiant est associé à deux cours distincts Projeter sur l'attribut num_et
Renommage en SQL : exemple Numéros des étudiants inscrits à au moins deux cours distincts SELECT DISTINCT i.num_et FROM inscrit, inscrit i WHERE inscrit.num_et = i.num_et AND inscrit.num_et <> i.num_et inscrit : version d'origine, i : 'copie' de inscrit inscrit.num_et = i.num_et : condition de jointure inscrit.num_et <> i.num_et : condition de sélection
Autres prédicats de sélection LIKE : chaînes de caractères (avec % ou _) BETWEEN : spécifie un intervalle de valeurs IN : teste l 'appartenance à un ensemble ou un intervalle EXISTS : teste si l'argument est vide ou non ANY : est vrai si au moins une comparaison avec les éléments de l'argument est vraie ALL : est vrai si toutes les comparaisons avec les éléments de l'argument sont vraies
Exemples Noms des cours commençant par 'Bases', de numéros entre 10 et 50, auxquels au moins un étudiant est inscrit SELECT nom_c FROM cours WHERE nom_c LIKE 'Bases%' AND EXISTS (SELECT * FROM inscrit WHERE num_c BETWEEN 10 AND 50 AND num_c = cours.num_c)
Exemples Nouvelle table resultat[num_et, num_c, note] Numéros des étudiants ayant la meilleure note au cours de numéro 10 SELECT num_c FROM resultat WHERE note >= ALL (SELECT note FROM resultat WHERE num_c = 10)
Exemples Nouvelle table resultat[num_et, num_c, note] Numéros des étudiants ayant une note supérieure à une des notes de l'étudiant numéro 100 SELECT num_c FROM resultat WHERE note >= ANY (SELECT note FROM resultat WHERE num_et = 100)
Fonctions en SQL Sur les chaînes de caractères (dépendent du logiciel) Sur les dates (dépendent du logiciel) Sur les nombres Opérations +, -, / Somme (SUM), minimum (MIN), maximum (MAX), moyenne (AVG) Comptage (COUNT)
Exemples Avec resultat[num_et, num_c, note] Afficher la table resultat en mettant les notes sur 10 (au lieu de sur 20) SELECT num_et, num_c, note/2 FROM resultat
Exemples Avec resultat[num_et, num_c, note] Meilleure note, note minimale et note moyenne du cours de numéro 10 SELECT MAX(note), MIN(note), AVG(note) FROM resultat WHERE num_c = 10
Exemples Avec resultat[num_et, num_c, note] Numéros des étudiants ayant la meilleure note au cours de numéro 10 SELECT num_c FROM resultat WHERE note = (SELECT MAX(note) FROM resultat WHERE num_c = 10)
Exemples Avec inscrit[num_et, num_c] Nombre d'étudiants inscrits au cours 10 SELECT COUNT(num_et) FROM inscrit WHERE num_c = 10 Nombre de cours auxquels au moins un étudiant est inscrit SELECT COUNT(DISTINCT num_c) FROM inscrit
Groupement en SQL Problème : comment généraliser les requêtes précédentes? Par exemple : calculer les moyennes de tous les cours Partitionner la table resultat cours par cours Pour chaque cours calculer la moyenne En SQL : GROUP BY [HAVING condition] A la suite de SELECT... FROM... WHERE HAVING sélectionne certains groupes
Exemples Numéros des cours et moyennes associées SELECT num_c, AVG(note) FROM resultat GROUP BY num_c Numéros et moyennes des cours dont toutes les notes sont strictement inférieures à 10 SELECT num_c, AVG(note) FROM resultat GROUP BY num_c HAVING MIN(note) < 10
Manipulation des données : mise à jour des tables Insertion, en spécifiant les valeurs du n-uplet à insérer une requête dont le résultat est ajouté à la table Suppression Les n-uplets à supprimer sont caractérisés par une condition (clause WHERE) Modification Les n-uplets à modifier sont caractérisés par une condition (clause WHERE) Les attributs à modifier sont listés avec les modifications
Insertion INSERT INTO <table> [( attribut [,attribut] )] {VALUES <valeur> [, <valeur>] <requête>} Insérer (10, 'Jules', 'Paris') dans etudiant INSERT INTO etudiant VALUES (10, 'Jules', 'Paris') Insérer dans resultat les numéros de cours et d'étudiants de inscrit INSERT INTO result (num_et, num_c) SELECT num_et, num_c FROM inscrit
Suppression DELETE FROM <table> [WHERE <condition>] Supprimer de resultat toutes les notes de l'étudiant de numéro 100 DELETE FROM resultat WHERE num_et = 100 Sans condition, la table est vidée DELETE FROM prof Supprime tous les enseignants de la table prof
Modification UPDATE <table> SET <attribut> = {expression NULL} [<attribut> = {expression NULL}] [WHERE <condition>] Ajouter un point à toutes les notes inférieures ou égales à 7 UPDATE resultat SET note = note +1 WHERE note <= 7
Définition des données Création d'une table : CREATE TABLE <table> (<attribut> = type [contrainte [contrainte]...], [<attribut> = type [contrainte [contrainte]...],...]) Types (http://www.ss64.com/orasyntax/datatypes.html) Numérique : INT, NUMBER[(x,y)],... Caractères : CHAR(x), VARCHAR(x),... Date...
Définition des données Contraintes élémentaires Valeur par défaut : DEFAULT Clé primaire : PRIMARY KEY interdit les répétitions et la valeur NULL, facilite l'accès par un index Unique : UNIQUE interdit les répétitions Clé étrangère : FOREIGN KEY réfère une clé primaire d'une autre table et oblige les valeurs dans la table courante à être parmi les valeurs des clés primaires
Exemple Création de la table etudiant CREATE TABLE etudiant ( num_et INT PRIMARY KEY, nom_et varchar(10) NOT NULL, adr_et varchar(20)) Création de la table cours CREATE TABLE cours ( num_c INT PRIMARY KEY, nom_c varchar(10), niveau varchar(10) NOT NULL)
Exemple Création de la table resultat CREATE TABLE inscrit ( num_et INT REFERENCES etudiant(num_et), num_c INT REFERENCES cours(num_c), note INT DEFAULT 10 CONSTRAINT note_range CHECK (note BETWEEN 0 AND 20), CONSTRAINT note_unique UNIQUE(num_et, num_c))