Module 3 : Les Bases
de Données Objet-
relationnelle (Section 1)
Riadh ZAAFRANI
Octobre 2020
1ère année MP2L
1
Base de données relationnelles-objets
Extension du modèle relationnel à l’aide de types
de données abstraits
Références directes à un OID (réduction du nombre
de jointures).
Attributs : types structurés et collections
Perte de la 1FN (NF2 : Non First Normal Form)
Méthodes définies au niveau des types
Héritage entre types
2
1
Avantages de l’approche relationnelle-objet
Encapsulation des données des tables
Préservation des acquis des
relationnels
données/traitements,
compatibilité ascendante…)
systèmes
(indépendance
fiabilité, performance,
Extension du langage SQL (norme SQL3)
Mise en œuvre des concepts objets (classes,
héritage, méthodes)
3
Inconvénients de l’approche relationnelle-objet
Modèle de données qui ne repose pas sur
théorie
simples
principes
une
/
des
rigoureuse
Pas de syntaxe commune de la part des
Oracle,
SGBD
(IBM,
éditeurs
PostgreSQL, SAP …)
de
Migration relationnel Objet facile,
mais retour en arrière complexe
4
2
Plan
Types d'objets et héritage
Références et associations
Collections
Méthodes
Vues objet
5
Type d’objet
L'extension à l'objet du modèle relationnel prend en
charge les types abstraits de données qui sont
définis à partir d'une structure de données et d'un
ensemble d'opérations.
La syntaxe de création d'un type d'objet comporte
la déclaration de la structure de données, ses
méthodes et la partie qui positionne le type dans
une hiérarchie d'héritage.
6
3
Type d’objet
CREATE [OR REPLACE] TYPE [SCHEMA.]NOM_TYPE
{{ IS / AS } OBJECT
UNDER [SCHEMA.]SUPERTYPE}
AS OBJECT
( NOM _ATTRIBUT TYPE [, ...]
{
{ MEMBER / STATIC }
{ PROCEDURE name (NOM_ARGUMENT TYPE [,.. .])
| FUNCTION name (NOM_ARGUMENT TYPE [,.. .]) RETURN datatype}
| CONSTRUCTOR FUNCTION NOM _TYPE
[ (
[ SELF lN OUT NOM_TYPE]
[,NOM_ARGUMENT datatype[,. ..]]
) ]
RETURN SELF AS RESULT
}
)
[ [NOT ] FINAL];
7
Type d’objet
UNDER SUPERTYPE : Indique le type de l'objet ancêtre.
MEMBER : Les méthodes membres sont
explicitement par une instance du type d'objet.
invoquées
STATIC : Les méthodes statiques sont
invoquées par le
SELF : C'est
argument
type d'objet et non par une instance du type d'objet.
pour
«
le
un
CONSTRUCTOR » qui désigne l'objet
Il est
également accessible dans les autres méthodes sauf les
méthodes de type «STATIC ».
Une
Publicité
s'applique
automatiquement à tout objet lors de l'instanciation. Le type
de retour est le type de l'objet construit.
lui même.
implicite
fonction
qui
:
CONSTRUCTOR
FINAL : Le type d'objet ne peut plus être utilisé comme
ancêtre pour un autre type d'objet.
8
4
Base de données exemple
ETAT_CIVIL
Nom : String
Prenom : String
DateNaiss : Date
ADRESSE
Rue : String
CP : String
Ville : String
Personne
idPers : int
EtCiv : ETAT_CIVIL
Adr : ADRESSE
ENSEIGNANT
Statut : String
1
RefEns
1..*
Cours
idCours : int
Libellé: String
1
RefCours
1..*
ETUDIANT
1
Diplomes_Collection
1..*
RefForma
1
FORMATION
idForma : int
NomForma : String
9
Types de données
Types de données
Intégrés
Personnalisés
(types structurés et classes)
Scalaires
CHAR, VARCHAR,
NUMBER, DATE…
Collections
VARRAY
TABLE
Références
(pointeurs)
REF
10
5
Types d’objets personnalisés
Exemples de création de types
CREATE OR REPLACE TYPE ETAT_CIVIL_t
AS OBJECT (
Nom VARCHAR(50),
Prenom VARCHAR(30),
DateNaiss DATE)
ETAT_CIVIL
Nom : String
Prenom : String
DateNaiss : Date
/
CREATE OR REPLACE TYPE ADRESSE_t
AS OBJECT (
Rue VARCHAR(100),
CP CHAR(5),
Ville VARCHAR(50))
ADRESSE
Rue : String
CP : String
Ville : String
/
Types d’objets personnalisés
CREATE OR REPLACE TYPE PERSONNE_t
AS OBJECT (
IdPers NUMBER(5),
EtCiV ETAT_CIVIL_t,
Adr ADRESSE_t)
Personne
idPers : int
EtCiv : ETAT_CIVIL
Adr : ADRESSE
/
12
6
Types récursifs
Personne
idPers : int
EtCiv : ETAT_CIVIL
Adr : ADRESSE
0..1
0..*
Utilisation d'une référence
Chef
Ex. CREATE OR REPLACE TYPE PERSONNE_t
Publicité
AS OBJECT (
Idpers NUMBER(5),
EtCIV ETAT_CIVIL_t,
Adr ADRESSE_t,
chef REF PERSONNE_t)
/
Ref permet de récupérer la référence de chaque
objet stocké dans la table PERSONNE.
13
Types mutuellement dépendants
RefCours
1
ENSEIGNANT
Statut : String
1
1
Cours
idCours : int
Libellé: String
1
Utilisation de types incomplets
RefEns
- Ex.
CREATE TYPE ENSEIGNANT_t
/-- Type incomplet
CREATE TYPE COURS_t AS OBJECT (...,
RefEns REF ENSEIGNANT_t)
/
CREATE TYPE ENSEIGNANT_t AS OBJECT(...,
RefCours REF COURS_t)
/-- On a complété le type incomplet
Destruction: DROP TYPE ENSEIGNANT_t FORCE;
14
7
Stockage d’un type objet
Dans un contexte de bases de données, un
type abstrait de données peut être perçu
comme :
Une nouvelle gamme de colonnes définie
par l’utilisateur qui enrichit celle existante.
Les types peuvent se combiner entre eux
pour en construire d’autres.
Une structure de données partagée qui
permet qu'un type puisse être utilisé par
une ou plusieurs tables.
15
Stockage d’un type objet
Un type abstrait de données peut être stocké
dans une table de deux manières:
Les objets colonne qui sont stockés en
tant que colonne structurée dans une table
relationnelle.
Les objets enregistrements qui
sont
stockés en tant que ligne d'une table objet.
À ce titre, ils possèdent un identificateur
unique appelé OID (Object IDentifier). Ces
objets peuvent être indexés et partitionnés.
16
8
Persistance des objets
Objets
colonnes:
décrivant des
relationnelle(s)
types
structurés
champs de table(s)
Objets lignes: stockés en tant que n-
uplets d'une table objet
Objets non persistants: utilisés en
mémoire dans un programme PL/SQL
17
Objets colonnes
Table relationnelle
Ex.
CREATE TABLE les_personnes (
IdPers NUMBER(5) PRIMARY KEY,
EtCiv ETAT_CIVIL_t,
Adr ADRESSE_t);
Instanciation
Ex.
INSERT INTO les_personnes VALUES (1000,
ETAT_CIVIL_t('Ben Abdallah', 'Salem', '15/10/1982'),
ADRESSE_t('5 av. Madrid', '1000', 'Tunis'));
Interrogation
Ex.
SELECT IdPers, p.EtCiv.Nom, p.Adr.Ville
FROM les_personnes p;
18
9
Objets lignes
Table objet
Ex.
CREATE TABLE les_personnes OF PERSONNE_t (
CONSTRAINT pers_pk PRIMARY KEY (IdPers));
Baser l'identifiant objet (OID) sur la clé primaire : ajout de la
clause OBJECT IDENTIFIER IS PRIMARY KEY
Instanciation
- Ex.
INSERT INTO les_personnes VALUES
(PERSONNE_t (1000,
ETAT_CIVIL_t('Ben Abdallah', 'Salem', '15/10/1982'),
ADRESSE_t('5 av. Madrid', '1000', 'Tunis')));
Interrogation
Ex.
SELECT IdPers, p.EtCiv.Nom, p.Adr.Ville
FROM les_personnes p;
Publicité
19
Objets non persistants
Déclaration PL/SQL
Ex.
DECLARE
Instanciation
une_personne PERSONNE_t;
Ex.
BEGIN
une_personne := NEW PERSONNE_t (1000,
ETAT_CIVIL_t('Ben Abdallah', 'Salem', '15/10/1982'),
ADRESSE_t('5 av. Madrid', '1000', 'Tunis'));
Utilisation
Ex.
une_personne.IdPers := 1111;
une_personne.Adr.Ville := 'Ariana';
DBMS_OUTPUT.PUT_LlNE(une_personne.EtCiv.Nom);
20
10
Mise à jour d’objets persistants
Modification
Ex. UPDATE les_personnes p
SET p.Adr.Ville = 'Ariana'
WHERE IdPers = 1000;
Suppression
Ex. DELETE FROM les_personnes p
WHERE p.EtCiv.Nom = 'Ben Mohamed';
21
Chargement d’objets persistants
Dans une requête SQL
SELECT VALUE(p) FROM les_personnes p;
Ex.
Value peut être spécifiée uniquement dans une instruction
SQL et permet de récupérer l’objet de l’enregistrement pour
la table que représente l’argument de la directive. Il s’agit
d’un alias de la table.
Dans un bloc PL/SQL
Ex.
DECLARE
une_personne PERSONNE_t;
BEGIN
SELECT VALUE(p) INTO une_personne
FROM les_personnes p WHERE IdPers = 1000;
DBMS_OUTPUT. PUT_LINE
(une_personne.EtCiv.Nom);
END;
/
22
11
Héritage
Superclasse
Ex.
CREATE TYPE PERSONNE_t AS OBJECT (
IdPers NUMBER(5),
EtCIV ETAT_CIVIL_t,
Adr ADRESSE_t)
[NOT INSTANTIABLE] -- Classe abstraite (optionnel)
NOT FINAL
/
Sous-classe
Ex.
CREATE TYPE ENSEIGNANT_t UNDER
PERSONNE_t (
Statut VARCHAR(20))
/
23
Substitution de types
Objets : Un objet peut contenir une
instance de tout sous-type de son
propre type.
Références: Une référence qui cible un
type peut pointer vers une instance de
tout sous-type de ce type.
Collections: Une collection d'éléments
d'un type peut contenir des instances
de tout sous-type de ce type.
24
12
Substitution de types
Exemple :
INSERT INTO les_personnes VALUES (
PERSONNE_t(2000,
ETAT_CIVIL_t('Ben Ahmed', 'Karim', '02/02/1932'),
ADRESSE_t ('Place Barcelone', '1000', 'Tunis')));
INSERT INTO les_personnes VALUES (
ENSEIGNANT_t(3000,
ETAT_CIVIL_t(‘Ben Jemaa', 'Omar', '01/08/1962'),
ADRESSE_t ('Rue de Rome', '1000', 'Tunis'),
'Professeur'));
25
Fonctions sur les objets colonnes
ADRESSE
Rue : String
CP : String
Ville : String
ADR_ETRANGER
Pays : String
SELECT TREAT(ADRESSE_t AS ADR_ETRANGER_t)
FROM les_personnes;
-- Recherche sélective des adresses des personnes habitant à
l'étranger
Fonction IS OF : Traite à un niveau de la hiérarchie les objets
pour sélectionner que ceux des niveaux inférieurs de la
hiérarchie (la racine étant le niveau 0)
SELECT VALUE(p) FROM les_personnes p
WHERE p.ADRESSE_t IS OF(ADR_ETRANGER_t);
-- Caractéristiques des personnes habitant à l'étranger
26
Publicité
13
Héritage de type et non de table
Plan
Types d'objets et héritage
Références et associations
Collections
Méthodes
Vues objet
27
28
14
Mise en œuvre de références
Définition
- Ex. CREATE TYPE COURS AS OBJECT(
IdCours NUMBER(2),
Libelle VARCHAR(50),
RefEns REF ENSEIGNANT)
- NB : RefEns pointe vers l'OID d'un enseignant.
Instanciation
Ex. CREATE TABLE les_cours OF COURS(
CONSTRAINT pk_cours PRIMARY KEY(ldCours));
Une référence peut aussi être une colonne d'une table
relationnelle.
2929
Mise en œuvre de références
Insertion
Ex. INSERT INTO les_cours
VALUES(1, 'Economie', (SELECT REF(e) FROM
les_enseignants e WHERE e.ldPers = 9000));
NB : L'OID de les_enseignants ne doit pas être basé sur
la clé primaire pour que la référence fonctionne.
Mise à jour
Ex. UPDATE les_cours c
SET c.RefEns = (SELECT REF(e) FROM
les_enseignants e WHERE e.ldPers = 9002)
3030
WHERE c.ldCours = 1;
15
Jointures implicites
Dans la clause WHERE
Ex.
SELECT c.Libelle FROM les cours c
WHERE c.RefEns.EtCiv.Nom = 'Chater';
Dans la clause SELECT
Ex.
SELECT c.RefEns.EtCiv.Nom
FROM les cours c
WHERE c_Libelle = 'Économie';
Déréférencement
Ex.
SELECT DEREF(RefEns) FROM les_cours
WHERE IdCours = 1;
Substitution de références
Exemple
CREATE TYPE REF _PERS(Ref REF PERSONNE)
/
CREATE TABLE Index_personnes OF REF_PERS;
INSERT INTO Index_personnes VALUES
(SELECT REF(p) FROM les_personnes p
WHERE p.ldpers = 1000);
INSERT INTO Index_personnes VALUES
(SELECT REF(e) FROM les_enseignants e
WHERE e.ldPers = 9000);
3131
3232
16
Associations
Associations 1-N
Ex. COURS-ENSEIGNANT
Associations M-N
ETUDIANT 0..*
0..*
FORMATION
Ex.
CREATE TABLE NOTATION (
RefEtu REF ETUDIANT,
RefEpr REF EPREUVE,
Note NUMBER(4,1));
3333
Intégrité référencielle
Cohérence parent-enfant
Ex. La suppression d'un enseignant auquel des cours
sont rattachés doit être impossible.
Instanciation
Ex. CREATETABLE les_cours OF COURS(
CONSTRAINT pk_cours PRIMARY KEY(ldCours),
CONSTRAINT fk_cours_ref_ens1
RefEns REFERENCES les_enseignants);
3434
17
Intégrité référencielle
Cohérence enfant-parent
Ex. L'insertion d'une référence vers un enseignant
inexistant doit être impossible.
Instanciation
Ex. CREATE TABLE les_cours OF COURS(
CONSTRAINT pk_cours PRIMARY KEY(ldCours),
CONSTRAINT fk_cours_ref_ens1
RefEns REFERENCES les_enseignants,
CONSTRAINT fk_cours_ref_ens2
CHECK (RefEns IS NOT NULL));
3535
18