LOG660 - Bases de données de haute performance Paradigme relationnel-objet Hiver 2011 C. Desrosiers 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 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 R. Godin, C. Desrosiers - Hiver 2011 3 Robert Godin. Tous droits réservés. 1
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 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 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 R. Godin, C. Desrosiers - Hiver 2011 6 Robert Godin. Tous droits réservés. 2
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 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 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 : String CREATE TYPE EditeurType AS OBJECT VARCHAR(20 CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, (PRIMARY KEY 1 1..* CREATE TABLE Livre OF LivreType (PRIMARY KEY, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur SCOPE IS Editeur Livre {UNIQUE: ISBN} ISBN : String : String annéeparution : TypeDonnéesAnnée R. Godin, C. Desrosiers - Hiver 2011 9 Robert Godin. Tous droits réservés. 3
Type de valeurs d'un attribut ou colonne Livre {UNIQUE: ISBN} ISBN : String : String annéeparution : TypeDonnéesAnnée <<datatype>> TypeDonnéesAnnée {Integer > 0 } CREATE TYPE TypeDonnéesAnnée AS OBJECT (valeurannée INTEGER CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, CREATE TABLE Livre OF LivreType (PRIMARY KEY, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur SCOPE IS Editeur 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 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 R. Godin, C. Desrosiers - Hiver 2011 12 Robert Godin. Tous droits réservés. 4
Traduction d'une association un à plusieurs UML par référence simple (REF Editeur {UNIQUE: nomediteur} nomediteur : String : String Livre {UNIQUE: ISBN} ISBN : String 1 1..* : String annéeparution : TypeDonnéesAnnée CHAR(13, VARCHAR(50, annéeparution DomaineAnnée,, R. Godin, C. Desrosiers - Hiver 2011 13 Contrainte SCOPE IS Editeur {UNIQUE: nomediteur} nomediteur : String : String 1 1..* Livre {UNIQUE: ISBN} ISBN : String : String annéeparution : TypeDonnéesAnnée CHAR(13, VARCHAR(50, annéeparution DomaineAnnée,, CREATE TABLE Livre OF LivreType (PRIMARY KEY, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur SCOPE IS Editeur R. Godin, C. Desrosiers - Hiver 2011 14 Références inverses Editeur {UNIQUE: nomediteur} nomediteur : String : String CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, 1 1..* Livre {UNIQUE: ISBN} ISBN : String : String annéeparution : TypeDonnéesAnnée CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType CREATE OR REPLACE TYPE EditeurType AS OBJECT leslivres tablereflivrestype (PRIMARY KEY NESTED TABLE leslivres STORE AS tableleslivres R. Godin, C. Desrosiers - Hiver 2011 15 Robert Godin. Tous droits réservés. 5
Représentation d'un type de données complexe ou d'une composition UML par un UDT Membre {UNIQUE : nomembre} nomembre : Integer nom : String prénom : String adresse : typedonnéesadresse CREATE TYPE TypeDonnéesAdresse AS OBJECT (nocivique INTEGER, numéroappartement INTEGER, nomrue nomville nomprovince nompays codepostal VARCHAR(10 <<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 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 leslivres tablelivrestype (PRIMARY KEY NESTED TABLE leslivres STORE AS tableleslivres Stockage à part 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 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 R. Godin, C. Desrosiers - Hiver 2011 18 Robert Godin. Tous droits réservés. 6
Définition de méthodes CREATE OR REPLACE TYPE EditeurType AS OBJECT 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..nomediteur = SELF.nomEditeur; RETURN nb; END nblivres; END; SELECT FROM WHERE e.nblivres( Editeur e e.nomediteur = 'XXX' 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 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 Personne nom : String prénom : String Utili sateur {UNIQUE :idutilis ateur} idutilisateur : String motpasse : String R. Godin, C. Desrosiers - Hiver 2011 21 Robert Godin. Tous droits réservés. 7
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 R. Godin, C. Desrosiers - Hiver 2011 22 Extensions au langage de manipulation de données SQL Expression de chemin SELECT m.nom, m.adresse.nomrue FROM Membre m 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 WHERE m.adresse.nomville = 'Montréal' R. Godin, C. Desrosiers - Hiver 2011 23 Cheminement par références CREATE TYPE EditeurType AS OBJECT VARCHAR(20 CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, (PRIMARY KEY CREATE TABLE Livre OF LivreType (PRIMARY KEY, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur SCOPE IS Editeur SELECT l..nomediteur, l.isbn FROM Livre l WHERE l.. = 'Paris' R. Godin, C. Desrosiers - Hiver 2011 24 Robert Godin. Tous droits réservés. 8
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. FROM Livre l WHERE l.. = 'Paris' R. Godin, C. Desrosiers - Hiver 2011 25 Accès à une table enchâssée par l'opérateur d'aplatissement (TABLE CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType CREATE OR REPLACE TYPE EditeurType AS OBJECT leslivres tablereflivrestype (PRIMARY KEY NESTED TABLE leslivres STORE AS tableleslivres SELECT livres.livreref.isbn, livres.livreref. FROM TABLE (SELECT e.leslivres FROM Editeur e WHERE nomediteur = 'Addison-Wesley' livres R. Godin, C. Desrosiers - Hiver 2011 26 Insertion et constructeur d'objet CREATE TYPE EditeurType AS OBJECT (PRIMARY KEY INSERT INTO Editeur VALUES ('Loze-Dion', 'Longueuil' INSERT INTO Editeur VALUES (EditeurType('Loze-Dion', 'Longueuil' R. Godin, C. Desrosiers - Hiver 2011 27 Robert Godin. Tous droits réservés. 9
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' R. Godin, C. Desrosiers - Hiver 2011 28 Colonne REF CREATE TYPE EditeurType AS OBJECT VARCHAR(20 CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, (PRIMARY KEY CREATE TABLE Livre OF LivreType (PRIMARY KEY, CONSTRAINT annéesup0 CHECK(annéeParution.valeurAnnée > 0, CONSTRAINT referencetableediteur 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' R. Godin, C. Desrosiers - Hiver 2011 29 Insertion dans un NESTED TABLE CHAR(13, VARCHAR(50, annéeparution TypeDonnéesAnnée, CREATE TYPE LivreRefType AS OBJECT (livreref REF LivreType CREATE TYPE tablereflivrestype AS TABLE OF LivreRefType CREATE OR REPLACE TYPE EditeurType AS OBJECT leslivres tablereflivrestype (PRIMARY KEY 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' R. Godin, C. Desrosiers - Hiver 2011 30 Robert Godin. Tous droits réservés. 10
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 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(" :"+(StringattributsDeLivre[1]; // VARCHAR(50 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 ; protected Typedonnéesannée annéeparution; protected java.sql.ref ; public LivreTypePourUDT({} // Lecteurs et modifieurs public String getisbn({ return ISBN; } public void setisbn(string isbn{ this.isbn = isbn; } // public int getlengthtitre({ return.length(;} public String gettitreenminuscules({return.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 } Robert Godin. Tous droits réservés. 11
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(" :"+unlivretype.gettitre(; // VARCHAR(50 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 Outil REPLACE loadjava TYPE d Oracle TypeDonnéesAnnée AS OBJECT EXTERNAL NAME 'Typedonnéesannée' LANGUAGE JAVA USING SQLData (valeurannée INTEGER EXTERNAL NAME 'valeurannée' EXTERNAL NAME 'LivreTypePourUDT' LANGUAGE JAVA USING SQLData CHAR(13 EXTERNAL NAME 'ISBN', VARCHAR(50 EXTERNAL NAME '', annéeparution TypeDonnéesAnnée EXTERNAL NAME 'annéeparution', EditeurType EXTERNAL NAME '', REF 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 R. Godin, C. Desrosiers - Hiver 2011 35 Robert Godin. Tous droits réservés. 12