Vous êtes sur la page 1sur 10

Modle objet - relationnel SQL99

Universit de Nice Sophia-Antipolis


Version 0.9.7 13/10/06

Introduction

Richard Grin

R. Grin

Objet-relationnel

page 2

Modle objet-relationnel
Le modle objet-relationnel (OR) reprend le modle relationnel en ajoutant quelques notions qui comblent les plus grosses lacunes du modle relationnel La compatibilit est ascendante : les anciennes applications relationnelles fonctionnent dans le monde OR La norme SQL99 (SQL3) reprend beaucoup d'ides du modle OR

R. Grin Objet-relationnel page 3

Pourquoi tendre le modle relationnel ?


La reconstitution dobjets complexes clats sur plusieurs tables relationnelles est coteuse car elle occasionne de nombreuses jointures Pour chapper aux clatements-jointures, l'OR rhabilite n les rfrences qui permettent d'implanter des structures complexes n les attributs multivalues (tableaux, ensembles ou listes)

R. Grin Objet-relationnel page 4

Pourquoi tendre le modle relationnel ?


Pourquoi tendre le modle relationnel ?


Mme si ce problme nest pas inhrent au modle relationnel, SQL92 ne permet pas de crer de nouveaux types, ce qui implique un manque de souplesse et une interface difficile avec les applications orientes objet L'OR (et SQL99) permet de dfinir de nouveaux types utilisateur simples ou complexes (User data type), avec des fonctions ou procdures associes comme dans les classes des langages objet
R. Grin Objet-relationnel page 6

L'utilisation de rfrences facilite aussi l'utilisation des donnes trs volumineuses du multimdia en permettant leur partage simplement et moindre cot (sans jointure)

R. Grin

Objet-relationnel

page 5

Pourquoi tendre le modle relationnel ?

Pourquoi ne pas passer directement aux SGBD Objet ?

L'OR supporte l'hritage de type pour profiter du polymorphisme et faciliter la rutilisation

Le relationnel a ses avantages, en particulier n sa grande facilit et efficacit pour effectuer des recherches complexes dans des grandes bases de donnes n la facilit de spcifier des contraintes dintgrit sans programmation n une thorie solide et des normes reconnues

R. Grin

Objet-relationnel

page 7

R. Grin

Objet-relationnel

page 8

Pourquoi ne pas passer directement aux SGBD Objet ?


Inertie de l'existant : de trs nombreuses bases relationnelles en fonctionnement Manque de normalisation pour les SGBDO ; trop de solutions propritaires Moins souple que le relationnel pour sadapter plusieurs applications et laugmentation de charge

Nouvelles possibilits de lOR


Dfinir de nouveaux types complexes avec des fonctions pour les manipuler Une colonne peut contenir une collection (ensemble, sac, liste) Ligne considre comme un objet, avec un identificateur (Object Identifier OID) Utilisation de rfrences aux objets Extensions du langage SQL (SQL3 ou SQL99) pour la recherche et la modification des donnes

R. Grin Objet-relationnel page 10

Peu d'informaticiens forms aux SGBDO

Le modle OR peut permettre un passage en douceur R. Grin Objet-relationnel page 9

Les problmes de l'OR


Ne s'appuie pas sur une thorie solide comme le modle relationnel Manque de standard de fait : implantations diffrentes, et encore partielles, dans les divers SGBDs

SQL99 (SQL3)
Cette partie du cours sappuie autant que possible sur les spcifications de SQL99 Le langage de programmation SQL99 ajoute SQL2 des variables et instructions de contrle pour en faire un langage procdural complet ; ce cours ne porte pas sur ces extensions Les exemples concrets sont donns dans le langage SQL de la version 10g dOracle ; les diffrences avec SQL99 seront signales
R. Grin Objet-relationnel page 12

R. Grin

Objet-relationnel

page 11

Nouveaux types prdfinis

Types dfinis par lutilisateur

Le relationnel objet ajoute des types prdfinis la norme SQL (tudis plus loin dans le cours) : n rfrence n collection n LOB (li aux objets de grande taille)

R. Grin

Objet-relationnel

page 13

R. Grin

Objet-relationnel

page 14

Les types utilisateur

Types distincts

Le dveloppeur peut aussi crer ses propres types de donnes : n types distincts n types structurs

Ces types permettent de mieux diffrencier les domaines des colonnes ; ils sont forms partir des types de base :
CREATE TYPE codePays as char(2); CREATE TYPE matricule as integer;

Par exemple, pour diffrencier le domaine des colonnes matricule et numDept Ces types sutilisent exactement avec les mmes instructions que le type de base sousjacent

R. Grin Objet-relationnel page 15 R. Grin Objet-relationnel page 16

Types structurs
Correspondent aux classes des langages objets Ils peuvent contenir des constructeurs, attributs ( variables dinstances), fonctions et procdures ( mthodes) Les membres peuvent tre public, protected ou private Les fonctions et procdures peuvent tre crites en SQL ou en un autre langage Supportent lhritage

R. Grin Objet-relationnel page 17

Cration dun type de donnes

La syntaxe est semblable celle de la cration dune table :


CREATE TYPE departement_type AS OBJECT (numDept integer, nomD varchar(30), lieu varchar(30));

Un type ne peut contenir de contrainte dintgrit La commande create or replace type permet de redfinir un type sil existe dj
R. Grin Objet-relationnel page 18

Fonctions dans les types


CREATE TYPE departement_type AS OBJECT (numDept integer, nomD varchar(30), lieu varchar(30), MEMBER FUNCTION getLieu RETURN varchar); CREATE TYPE BODY departement_type AS MEMBER FUNCTION getLieu RETURN varchar IS begin return lieu; end; end;
R. Grin Objet-relationnel page 19

Hritage

Les types supportent lhritage multiple avec le mot-cl UNDER :


create type employe_type as object (matr integer, nom varchar(30), sal numeric(8,2)) not final; create type commercial_type under employe_type (comm numeric(8,2)) not final;

Un type est final par dfaut


Objet-relationnel page 20

R. Grin

Ajout dun attribut dans un type


alter type employe_type add attribute date_naissance date cascade; Propage aux tables dj construites partir du type

Ajout dune mthode/fonction un type


alter type employe_type add member function age return integer cascade;

R. Grin

Objet-relationnel

page 21

R. Grin

Objet-relationnel

page 22

Supprimer un type
drop type employe_type;

Type de ligne
SQL99 possde aussi la notion de type de ligne qui correspond aux structures du C : cest un ensemble non encapsul dattributs Le type peut tre nomm ou non

R. Grin

Objet-relationnel

page 23

R. Grin

Objet-relationnel

page 24

Type de ligne non nomm

Type de ligne nomm

create table EMP (nomE varchar(35), adresse ROW(numero integer, rue varchar(30),))

CREATE ROW TYPE adresse_t (numero integer, rue varchar(30),) On peut ensuite utiliser ce type pour une dclaration dattribut ou mme pour crer une table partir de ce type (comme pour les autres types)

R. Grin

Objet-relationnel

page 25

R. Grin

Objet-relationnel

page 26

Vues du dictionnaire des donnes


Sous Oracle : USER_TYPES pour les types (et les collections) USER_TYPE_ATTRS pour attributs des types USER_TYPES_METHODS pour les mthodes des types USER_OBJECT_TABLES pour les tables objetrelationnelles Sous sqlplus dOracle : describe departement_type

R. Grin Objet-relationnel page 27 R. Grin

Tables

Objet-relationnel

page 28

Cration dune table partir dun type


Les donnes dun type ne sont persistantes que si elles sont ranges dans une table On peut crer des tables comme en SQL92 On peut aussi crer des tables partir dun type de donnes

Cration dune table partir dun type


Soit le type employe_type :
CREATE TYPE employe_type AS OBJECT (matricule integer, nom varchar(30), . . . dept integer);

On peut crer une table partir de ce type et indiquer des contraintes dintgrit :
create table employe OF employe_type (primary key (matricule));

R. Grin

Objet-relationnel

page 29

R. Grin

Objet-relationnel

page 30

Hritage de tables
Une table peut hriter dune ou plusieurs tables Pas support par Oracle 10g

Cration de table partir dun type driv


create table commerciaux of commercial_type (constraint pk_com primary key(matr));

R. Grin

Objet-relationnel

page 31

R. Grin

Objet-relationnel

page 32

Caractristiques dune table objet-relationnelle


Une table est une table objet-relationnelle si elle a t construite partir dun type (create table OF) Les lignes de ces tables sont considres comme des objets avec un identifiant (OID, Object IDentifier) On peut utiliser des rfrences pour dsigner les lignes de ces tables (pas possible pour les autres tables)

R. Grin Objet-relationnel page 33

Vues du dictionnaire des donnes

USER_OBJECT_TABLES pour les tables objet-

relationnelles

R. Grin

Objet-relationnel

page 34

Insertion de donnes

Insertion avec constructeur


On peut aussi utiliser le constructeur du type avec lequel la table a t construite :
insert into employe values ( employe_type(125, 'Dupond', ...));

On ajoute des donnes comme avec une table normale :


insert into commerciaux (matr, nom, sal, comm) values (234, 'TITI', 3200, 600);

Si le type est un type utilis par un autre type, lutilisation du constructeur du type est obligatoire :
insert into employe (matr, nom, sal, adresse) values (1, 'Toto', 12000, adresse_type(12, 'Victor Hugo', 'Nice'))

R. Grin

Objet-relationnel

page 35

R. Grin

Objet-relationnel

page 36

Afficher les valeurs des types

Modifications
Utiliser la notation pointe comme en SQL92 mais avec un alias si un type est concern :
update employe e set salaire = 12000, e.adresse.numero = 23 where nom = 'Dupond';

select nom, e.adresse.rue from employe e

SQL99 fournit aussi la notation .. pour dsigner un attribut dune colonne de type structur :
update employe set employe.adresse..numero = 12 where employe.nom = 'Dupond';

R. Grin

Objet-relationnel

page 37

R. Grin

Objet-relationnel

page 38

Appel de procdure ou fonction

select e.nom, age(e) from employe e where age(e) < 40

Le this est pass en paramtre

Sous Oracle :
select e.nom, e.age() from employe e where e..age() < 40

Rfrences

R. Grin

Objet-relationnel

page 39

R. Grin

Objet-relationnel

page 40

Rfrences

Exemple de select avec rfrence


La notation pointe permet de rcuprer les attributs dun type dont on a un pointeur Lieu de travail des employes (avec Oracle) :

On peut indiquer dans la dfinition dun type quun attribut contient des rfrences (et non des valeurs) des donnes dun autre type ; la syntaxe est REF nom-du-type :
create type employe_type as object (matricule integer, nom varchar(30), . . . dept REF dept_type);

select nom, e.dept.lieu from employe e

En SQL99 :
select nom, e.dept->lieu from employe e

Attention, lalias e est indispensable

R. Grin

Objet-relationnel

page 41

R. Grin

Objet-relationnel

page 42

Insertions avec rfrence


insert into employe values ( 1230, 'Durand', , NULL); pointeur NULL

Modifications avec rfrence


update employe set dept = (select REF(d) from dept d where numDept = 10) where matricule = 7500;

insert into employe(matricule, nom, dept) select 1240, 'Dupond', REF(d) from dept d where dept.numDept = 10; rfrence vers le dept de numro 10
R. Grin Objet-relationnel page 43

Attention, cette instruction peut trs bien mettre la valeur NULL dans la colonne dept car le select renvoie NULL si le dpartement de numro 10 nexiste pas !
R. Grin Objet-relationnel page 44

Contrainte NOT NULL

Contrainte sur les rfrences


Le type REF dept_type restreint le type rfrenc mais pas la table rfrence Une telle rfrence peut rfrencer une valeur de nimporte quelle colonne de table qui a le type dept_type La clause SCOPE restreint la colonne rfrence ; elle peut tre ajoute lors de la dfinition dune table

Pour viter le problme de lexemple prcdent, il faut ajouter la contrainte NOT NULL sur la colonne dept :
dept REF dept_type NOT NULL

R. Grin

Objet-relationnel

page 45

R. Grin

Objet-relationnel

page 46

Exemple de SCOPE

Rfrence perdue
SCOPE ne suffit pas pour imposer une contrainte stricte Ainsi la rfrence peut tre pendante (dangling) ou perdue , cest--dire ne pas correspondre une ligne existante, si la ligne rfrence au dpart a t ensuite supprime

dept REF dept_type scope is dept_table

indique que dept rfrencera une ligne de la table dept_table (et pas une ligne dune autre table cre partir du type dept_type)

R. Grin

Objet-relationnel

page 47

R. Grin

Objet-relationnel

page 48

References

Pour viter les rfrences perdues il faut remplacer la contrainte SCOPE par une contrainte REFERENCES (comme avec les tables relationnelles) :
dept REF dept_type references dept_table

Collections

R. Grin

Objet-relationnel

page 49

R. Grin

Objet-relationnel

page 50

Types de collections
Pour reprsenter une colonne multivalue, on peut utiliser les collections ou les tableaux : n tableaux de taille fixe (array) n ensembles, au sens mathmatiques ; pas de doublons (set) n sacs, avec des doublons (bag ou multiset) n listes, ordonnes et indexes par un entier (list) Dautres types de collections peuvent tre ajoutes par les SGBD

R. Grin Objet-relationnel page 51

Exemple de collection
create type employe_type (matricule integer, nom varchar(30), prenoms LIST(varchar(15)), enfants SET(personne), . . .);

R. Grin

Objet-relationnel

page 52

Utilisation dune collection

Les collections avec Oracle 10g

On peut utiliser une collection comme une table en la faisant prcder par le mot-cl TABLE :
select nom from employe E where nom in (select * from TABLE(E.prenoms))

On peut aussi faire afficher une collection comme un tout :


select nom, prenoms from employe

Oracle 10g noffre que 2 types de collections : n table imbrique (NESTED TABLE) qui est une collection non ordonne et non limite en nombre dlments n tableau prdimensionn (VARRAY) qui est une collection dlments de mme type, ordonne et limite en taille

R. Grin

Objet-relationnel

page 53

R. Grin

Objet-relationnel

page 54

Tables imbriques
Une table relationnelle (pas ncessairement OR) peut contenir une ou plusieurs tables imbriques Pas tudi dans ce cours ; se reporter au manuel Oracle pour plus de prcisions

Tableaux dimensionns
Un VARRAY est une collection ordonne et limite en nombre, dlments dun mme type On peut imbriquer plusieurs tableaux dimensionns en utilisant des pointeurs sur des tableaux

R. Grin

Objet-relationnel

page 55

R. Grin

Objet-relationnel

page 56

Exemple de VARRAY
create type telephones_type as VARRAY(3) OF varchar(10); insert into personne (nom, telephones) values('Dupond', telephones_type('0492077987', '0492074567'));

Rfrence
Programmer objet avec Oracle de Christian Soutou Vuibert

R. Grin

Objet-relationnel

page 57

R. Grin

Objet-relationnel

page 58

10