LOG660 - Bases de données de haute performance Paradigme relationnel-objet Hiver 2011 C. Desrosiers Département de génie logiciel et des TI
Le modèle relationnel-objet (OR Ajoute quelques notions au modèle relationnel, qui comblent ses plus grosses lacunes Compatibilité ascendante : les applications relationnelles fonctionnent dans le monde OR La norme SQL:1999 (SQL3 reprend beaucoup d'idées du modèle OR Diffère des bases de données objet (SGBDO Le monde de l application est distinct de celui de la BD Il faut quand même créer l interface entre ces deux mondes (ex: JDBC Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 2
Pourquoi le relationnel-objet? Simplicité et performance La reconstitution d objets complexes éclatés sur plusieurs tables relationnelles est coûteuse car elle occasionne de nombreuses jointures Pour échapper aux éclatements-jointures, l'or introduit Les références, qui permettent d'implanter des structures complexes Les attributs multivalués (tableaux, ensembles ou listes Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 3
Pourquoi le relationnel-objet? Rapprochement au monde objet (applications Permet de définir de nouveaux types utilisateur simples ou complexes (User data type Permet d encapsuler les opérations sur les données avec les données (fonctions, procédures Supporte l'héritage de type pour profiter du polymorphisme et faciliter la réutilisation Données multimédia volumineuses Facilite le stockage et la manipulation de données multimédia volumineuses en permettant leur partage simplement et à moindre coût (sans jointure Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 4
Pourquoi ne pas passer directement aux SGBD Objet? Inertie de l existant: de très nombreuses bases relationnelles en fonctionnement Manque de normalisation pour les SGBDO / trop de solutions propriétaires Moins souple que le relationnel pour s adapter à plusieurs applications et à l augmentation de charge Peu d'informaticiens formés aux SGBDO Le modèle OR peut permettre un passage en douceur Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 5
Nouvelles possibilités de l OR Définir de nouveaux types complexes avec des fonctions pour les manipuler Une colonne peut contenir une collection (ensemble, sac, liste Ligne considérée comme un objet, avec un identificateur (Object Identifier OID Utilisation de références aux objets Extensions du langage SQL (SQL3 ou SQL99 pour la recherche et la modification des données Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 6
Les problèmes de l'or Ne s'appuie pas sur une théorie solide comme le modèle relationnel Manque de standard de fait : implantations différentes, et encore partielles, dans les divers SGBDs Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 7
Types définis par l'utilisateur (UDT Équivalent à une classe en OO Un UDT possède Des attributs (simples ou autres types Des méthodes Utilisations d un UDT Comme colonne d'une table ordinaire, Comme attribut d'un autre type, Comme une ligne d'une table d'objets Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 8
Traduction d'une classe d'objets UML persistante par un type et une TABLE d'objets Editeur {UNIQUE: nomediteur} nomediteur : String ville : String CREATE TYPE EditeurType AS OBJECT (nomediteur ville VARCHAR(20 1 1..* Livre {UNIQUE: ISBN} ISBN : String titre : String annéeparution : TypeDonnéesAnnée CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur CREATE TABLE Livre OF LivreType (PRIMARY KEY(ISBN, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur éditeur SCOPE IS Editeur Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 9
Type de valeurs d'un attribut ou colonne Livre {UNIQUE: ISBN} ISBN : String titre : String annéeparution : TypeDonnéesAnnée <<datatype>> TypeDonné esannée {Integer > 0 } CREATE TYPE TypeDonnéesAnnée AS OBJECT (valeurannée INTEGER CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TABLE Livre OF LivreType (PRIMARY KEY(ISBN, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur éditeur SCOPE IS Editeur Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 10
Les références (REF Pointe vers un objet du type correspondant Renferme un identifiant objet (OID généré soit 1. Automatiquement (défaut indexation efficace potentiellement moins lourd qu avec la clé primaire 2. À partir de la clé primaire CREATE TABLE NomTable OF NomType ( ( PRIMARY KEY( OBJECT IDENTIFIER IS PRIMARY KEY Obligatoire Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 11
Les références (REF REF vs clé étrangère: Permet de représenter une relation 1 à plusieurs à l aide d une collection de références (jointure si clé étrangère Peut pointer dans le vide si l objet est supprimé Peut pointer sur des objets stockés dans des tables différentes Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 12
Traduction d'une association un à plusieurs UML par référence simple (REF Editeur {UNIQUE: nomediteur} nomediteur : String ville : String 1 1..* Livre {UNIQUE: ISBN} ISBN : String titre : String annéeparution : TypeDonnéesAnnée CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution DomaineAnnée, éditeur REF EditeurType, Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 13
Contrainte SCOPE IS Editeur {UNIQUE: nomediteur} nomediteur : String ville : String 1 1..* Livre {UNIQUE: ISBN} ISBN : String titre : String annéeparution : TypeDonnéesAnnée CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution DomaineAnnée, éditeur REF EditeurType, CREATE TABLE Livre OF LivreType (PRIMARY KEY(ISBN, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur éditeur SCOPE IS Editeur Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 14
Références inverses Editeur {UNIQUE: nomediteur} nomediteur : String ville : String CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType 1 1..* Livre {UNIQUE: ISBN} ISBN : String titre : String annéeparution : TypeDonnéesAnnée CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville leslivres tablereflivrestype CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur NESTED TABLE leslivres STORE AS tableleslivres Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 15
Représentation d'un type de données complexe ou d'une composition UML par un UDT CREATE TYPE TypeDonnéesAdresse AS OBJECT (nocivique INTEGER, numéroappartement INTEGER, nomrue nomville nomprovince nompays codepostal VARCHAR(10 Membre {UNIQUE : nomembre} nomembre : Integer nom : String prénom : String adresse : typedonnéesadresse <<datatype>> typedonnéesadresse numérocivique : Integer numéroappartement : Integer nomrue : String nomville : String nomprovince : String nompays : String codepostal : String CREATE TYPE MembreType AS OBJECT (nomembre INTEGER, nom prénom adresse typedonnéesadresse Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 16
Traduction du rôle * d une composition par NESTED TABLE (non approprié ici CREATE TYPE tablelivrestype AS TABLE OF LivreType CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville leslivres tablelivrestype CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur NESTED TABLE leslivres STORE AS tableleslivres Stockage à part Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 17
VARRAY Oracle (stockage interne à la table CREATE TYPE varraylivrestype AS VARRAY(10 OF LivreType CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville leslivres varraylivrestype VARRAY vs NESTED TABLE Les objets sont stockés directement dans la table, au lieu d une table séparée Évite la jointure entre les tables Ordre explicite entre les objets de la collection Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 18
Définition de méthodes CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville MEMBER FUNCTION nblivres RETURN NUMBER, PRAGMA RESTRICT_REFERENCES(nbLivres,WNDS,WNPS CREATE OR REPLACE TYPE BODY EditeurType AS MEMBER FUNCTION nblivres RETURN NUMBER IS nb NUMBER; BEGIN SELECT COUNT(* INTO nb FROM Livre l WHERE l.éditeur.nomediteur = SELF.nomEditeur; RETURN nb; END nblivres; END; SELECT FROM WHERE e.nblivres( Editeur e e.nomediteur = 'XXX' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 19
Autres détails sur les méthodes Paramètres MAP et ORDER: MAP: [MAP ORDER] MEMBER FUNCTION nomfonction[(paramètres] RETURN TypeRetour La valeur de retour est employée pour comparer deux objets de ce type ORDER: Prend en paramètre un objet et retourne {-1,0,+1} si cet objet est {<,=,>} à l objet sur lequel la fonction est appelée Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 20
Héritage de types CREATE TYPE PersonneType AS OBJECT (nom VARCHAR(10, prénom VARCHAR(10 NOT FINAL CREATE TYPE UtilisateurType UNDER PersonneType (idutilisateur VARCHAR(10, motpasse VARCHAR(10, catégorieutilisateur VARCHAR(14 Personn e nom : String prénom : String Utili sateur {UNIQU E :i dutil is ateur} idutil isateur : String motpasse : String Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 21
Autres détails sur l héritage Spécialisation des méthodes (dans le type enfant: [FINAL] OVERRIDING MEMBER FUNCTION nomfonction[(paramètres] RETURN TypeRetour FINAL: empêche la fonction d être redéfinie dans un sous-type OVERRIDING: spécifie que la fonction est une redéfinition Type abstrait (ex: interface Java CREATE TYPE NomType AS OBJECT ( NOT INSTANTIABLE Up/down cast TREAT(nomObjet as TypeEnfantOuParent.nomFonction( Tester le type d un objet SELECT VALUE(o FROM TableObjet WHERE VALUE(o IS OF (NomType1, NomType, VALUE: convertit en objet une ligne d une table d objets Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 22
Extensions au langage de manipulation de données SQL CREATE TYPE TypeDonnéesAdresse AS OBJECT (nocivique INTEGER, numéroappartement INTEGER, nomrue nomville nomprovince nompays codepostal VARCHAR(10 CREATE TYPE MembreType AS OBJECT (nomembre INTEGER, nom prénom adresse typedonnéesadresse CREATE TABLE Membre OF MembreType (PRIMARY KEY(noMembre Expression de chemin SELECT m.nom, m.adresse.nomrue FROM Membre m WHERE m.adresse.nomville = 'Montréal' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 23
Cheminement par références CREATE TYPE EditeurType AS OBJECT (nomediteur ville VARCHAR(20 CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur CREATE TABLE Livre OF LivreType (PRIMARY KEY(ISBN, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur éditeur SCOPE IS Editeur SELECT l.éditeur.nomediteur, l.isbn FROM Livre l WHERE l.éditeur.ville = 'Paris' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 24
Déréférences d objets DEREF DEREF: déréférencer de manière explicite une référence Exemple: afficher les attributs de l objet de type ÉditeurType SELECT DEREF(l.éditeur FROM Livre l WHERE l.éditeur.ville = 'Paris' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 25
Accès à une table enchâssée par l'opérateur d'aplatissement (TABLE CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville leslivres tablereflivrestype CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur NESTED TABLE leslivres STORE AS tableleslivres SELECT livres.livreref.isbn, livres.livreref.titre FROM TABLE (SELECT e.leslivres FROM Editeur e WHERE nomediteur = 'Addison-Wesley' livres Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 26
Insertion et constructeur d'objet CREATE TYPE EditeurType AS OBJECT (nomediteur ville CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur INSERT INTO Editeur VALUES ('Loze-Dion', 'Longueuil' INSERT INTO Editeur VALUES (EditeurType('Loze-Dion', 'Longueuil' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 27
TYPE dans une colonne CREATE TYPE TypeDonnéesAdresse AS OBJECT (nocivique INTEGER, numéroappartement INTEGER, nomrue nomville nomprovince nompays codepostal VARCHAR(10 CREATE TYPE MembreType AS OBJECT (nomembre INTEGER, nom prénom adresse typedonnéesadresse CREATE TABLE Membre OF MembreType (PRIMARY KEY(noMembre INSERT INTO Membre VALUES (10,'Tremblay','Jean',TypeDonnéesAdresse(100,2, 'Ste-Catherine','Montréal','Québec','Canada','H3C 3P8' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 28
Colonne REF CREATE TYPE EditeurType AS OBJECT (nomediteur ville VARCHAR(20 CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur CREATE TABLE Livre OF LivreType (PRIMARY KEY(ISBN, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur éditeur SCOPE IS Editeur INSERT INTO Livre SELECT '0-201-12227-8', 'Automatic Text Processing', typedonnéesannée(1989,ref(e FROM Editeur e WHERE nomediteur = 'Addison-Wesley' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 29
Insertion dans un NESTED TABLE CREATE TYPE LivreType AS OBJECT (ISBN CHAR(13, titre VARCHAR(50, annéeparution TypeDonnéesAnnée, éditeur REF EditeurType CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType CREATE OR REPLACE TYPE EditeurType AS OBJECT (nomediteur ville leslivres tablereflivrestype CREATE TABLE Editeur OF EditeurType (PRIMARY KEY(nomEditeur NESTED TABLE leslivres STORE AS tableleslivres INSERT INTO Editeur VALUES ('Loze-Dion', 'Longueuil',tableRefLivresType( INSERT INTO Livre SELECT '0-201-12227-8', 'Automatic Text Processing', TypeDonnéesAnnée(1989, REF(e FROM Editeur e WHERE nomediteur = 'Addison-Wesley' INSERT INTO THE (SELECT e.leslivres FROM Editeur e WHERE e.nomediteur = 'Addison-Wesley' SELECT REF(l FROM Livre l WHERE l.isbn = '0-201-12227-8' Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 30
Accès aux extensions objets en Java Créer une classe Java pour un UDT Typage faible : java.sql.struct Typage fort classe Java implements SQLData Créer un UDT à partir d une classe Java SQLJ (partie 2, SQL/JRT dans SQL:2003 Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 31
Typage faible par java.sql.struct // Recherche de la référence au LivreType ISBN = '0-201-12227-8' PreparedStatement unpreparedstatement = uneconnection.preparestatement ("SELECT REF(l AS reflivre FROM Livre l WHERE l.isbn = '0-201-12227-8'"; ResultSet unresultset = unpreparedstatement.executequery(; if (unresultset.next({ // Conversion de la référence à l'udt LivreType sous forme d'un objet Java REF REF ref = (REF unresultset.getobject(1; // Extraire l'objet LivreType référencé sous forme d'un STRUCT STRUCT unlivrestruct = (STRUCT ref.getvalue(; // Recherche des attributs du UDT LivreType sous forme d'un tableau d'objets Object attributsdelivre[] = unlivrestruct.getattributes(; // Cast des attributs selon leur type System.out.println("ISBN :"+(StringattributsDeLivre[0]; // ISBN CHAR(13 System.out.println("titre :"+(StringattributsDeLivre[1]; // titre VARCHAR(50 Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 32
Typage fort et conversion de type automatique avec SQLdata public class LivreTypePourUDT implements SQLData { // nomudt contient le nom du UDT qui correspond à la classe private String nomudt = "GODIN.LIVRETYPE"; protected String ISBN; protected String titre; protected Typedonnéesannée annéeparution; protected java.sql.ref éditeur; public LivreTypePourUDT({} // Lecteurs et modifieurs public String getisbn({ return ISBN; } public void setisbn(string isbn{ this.isbn = isbn; } // public int getlengthtitre({ return titre.length(;} public String gettitreenminuscules({return titre.tolowercase(;} // Méthodes de l'interface SQLdata à implémenter // Retourne le UDT SQL qui correspond à la classe Java public String getsqltypename( throws SQLException { return nomudt;} public void readsql(sqlinput stream, String type throws SQLException{ setisbn(stream.readstring(; settitre(stream.readstring(; setannéeparution((typedonnéesannéestream.readobject(; setéditeur(stream.readref(; } public void writesql(sqloutput stream throws SQLException{ stream.writestring(getisbn(; stream.writestring(gettitre(; stream.writeobject(getannéeparution(; stream.writeref(getéditeur(; Département de génie logiciel } et des TI R. Godin, C. Desrosiers - Hiver 2011 33 }
CAST du REF UDT en objet Java Pour le pilote JDBC // Recherche de la référence au LivreType ISBN = '0-201-12227-8' PreparedStatement unpreparedstatement = uneconnection.preparestatement ("SELECT REF(l AS reflivre FROM Livre l WHERE l.isbn = '0-201-12227-8'"; ResultSet unresultset = unpreparedstatement.executequery(; //Créer un type map qui associe le UDT à la classe SQLdata java.util.map typemap = uneconnection.gettypemap(; typemap.put("livretype",class.forname("livretypepourudt"; typemap.put("typedonnéesannée",class.forname("typedonnéesannée"; typemap.put("editeurtype",class.forname("editeurtypepourudt"; if (unresultset.next({ // Conversion de la référence à l'udt LivreType sous forme d'un objet Java REF REF ref = (REF unresultset.getobject(1; LivreTypePourUDT unlivretype = (LivreTypePourUDTref.getValue(; System.out.println("ISBN :"+unlivretype.getisbn(; // ISBN CHAR(13 System.out.println("titre :"+unlivretype.gettitre(; // titre VARCHAR(50 Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 34
Objet SQLJ : partie 2 de la norme SQLJ Déployer les classes Java TypeDonnéesAnnée et LivreTypePourUDT au niveau du serveur BD CREATE OR REPLACE TYPE TypeDonnéesAnnée AS OBJECT EXTERNAL NAME 'Typedonnéesannée' LANGUAGE JAVA USING SQLData (valeurannée INTEGER EXTERNAL NAME 'valeurannée' Outil loadjava d Oracle CREATE TYPE LivreType AS OBJECT EXTERNAL NAME 'LivreTypePourUDT' LANGUAGE JAVA USING SQLData (ISBN CHAR(13 EXTERNAL NAME 'ISBN', titre VARCHAR(50 EXTERNAL NAME 'titre', annéeparution TypeDonnéesAnnée EXTERNAL NAME 'annéeparution', éditeur REF EditeurType EXTERNAL NAME 'éditeur', MEMBER FUNCTION getlengthtitre return NUMBER EXTERNAL NAME 'getlengthtitre( return int', MEMBER FUNCTION gettitreenminuscules RETURN VARCHAR2 EXTERNAL NAME 'gettitreenminuscules( return String' Pas besoin d inclure la correspondance dans le typemap du programme Java Département de génie logiciel et des TI R. Godin, C. Desrosiers - Hiver 2011 35