Base de données orientée objet
Buts du modèle Objet-Relationnel
Gérer des données complexes (temps, géo-référencement, multimédia, types
utilisateurs, etc.).
Rapprocher le modèle logique du modèle conceptuel.
Réduire les pertes de performance liées à la normalisation et aux jointures.
Modèle Relationnel
Il est relativement simple, formellement défini (car il se base sur
l’algèbre relationnel).
Très mal adapté au données non structurées et semi-structurées aussi. Dans
plusieurs situations on doit fragmenter les données et donc le modèle
logique devient différent du modèle conceptuel.
On peut utiliser soit le SQL2 soit le SQL3 pour manipuler des bases de
données relationnelles.
Objet-Relationnel
On utilise le SQL3.
La relation sera en deuxième forme normale.
Le concept central du OR est celui de type utilisateur, qui permet
d'injecter la notion d'objet dans le modèle relationnel.
Un modèle objet relationnel a les propriétées RICE.
Avec le modèle objet relationnel on aura:
Moins fragmentation de données lors de la création de la base de données.
On peut avoir une seule table qui contient plusieurs attributs complexe.
Moins de jointures.
Type utilisateur
Sous oracle on a deux type, les types par défaut et les types objet.
Les types objets ou les types utilisateurs peuvent etre créés par
l’utilisateur. Ils peuvent contenir des méthodes.
Le type objet (ou bien type utilisateur), peut etre utilisé pour
Définir un nouveau type qui sera par la suite une colonne dans une table.
Définir une table relationnel ou une table objet relationnel.
Création type objet
Type de données créé par le concepteur, il encapsule des données et des
opérations sur ces données.
Base de données orientée objet 1
Les types des attributs (ou des méthodes) d'un type peuvent également être
des types utilisateurs.
-- Création d'un type t_adresse
CREATE TYPE t_adresse AS OBJECT (
num NUMBER,
rue VARCHAR(30),
ville VARCHAR(20),
codepostal CHAR(5)
) [NOT FINAL];
-- Utilisation du type t_adresse lors de DDL d'une table
CREATE TABLE employes (
num NUMBER,
dept NUMBER,
salaire NUMBER,
adresse t_adresse, -- type objet
nom VARCHAR(30),
PRIMARY KEY num
) ;
Manipulation type objet
Pour l’insertion, on utilise le constructeur de l’objet.
INSERT INTO employes VALUES (1000, 15, 2000, t_adresse (2, ‘Oued Smar’,
‘Algiers’, ‘49000’), ‘toto’) ;
Pour l’intérrogation, il est conseillé de toujours utiliser les alias afin
d’éviter les erreurs.
L'accès aux objets se fait obligatoirement en préfixant le chemin d'accès
par l'alias de la table et non directement par le nom de la table.
SELECT [Link] FROM employes e ;
SELECT [Link] FROM employes e ;
Utilisation d’un type objet dans une table objet relationnelle
Un table objet relationnelle est une table qui contient des éléments de type
objet. Chaque élement est identifié par un OID.
Un objet tout seul n’a pas d’OID.
Cette table peut être vu de deux manières différentes, soit une table
avec une seule colonne de type objet ou bien une table relationnel à
plusieurs colonne.
Dans cette table, on a deux façons d’insertion alors.
Vision objet, directement avec le constructeur.
Vision relationnelle, sans constructeur, manière classique.
Des méthodes peuvent être associées à une table-objet.
-- Création table objet
-- On peut spécifier des contraintes sur la table. E.g quel attribut sera ID
CREATE TABLE adresses OF t_adresse
Base de données orientée objet 2
-- Insérer des objets dans la table objet
-- Lors de l'insertion, on va attribuer un OID à l'objet inséré
INSERT INTO adresses VALUES (t_adresse(2,‘Oued Smar’, ‘Algiers’, ‘49000’));
INSERT INTO adresses VALUES (2,‘Oued Smar’, ‘Algiers’, ‘49000’);
-- Accéder aux objets de la table objet. Tout comme le cas relationnel
SELECT * FROM adresses ;
SELECT [Link], [Link], [Link], [Link] FROM adresses a;
-- Pour avoir les objets
SELECT VALUE(a) FROM adresse a;
-- Pour avoir les OIDs
SELECT REF(a) FROM adresse a ;
-- DEREF qui renvoie un objet à partir de sa référence
SELECT DEREF([Link]) FROM pays p;
SELECT DEREF(REF(v)) FROM villes v;
Simulation d’héritage
Comme déjà mentioné, le but du modèle relationnel est d’introduire les
notions de POO. Voici comme on simule l’héritage entre deux type objet.
-- Classe mère
CREATE TYPE t_personne AS OBJECT(
nom VARCHAR(30), prenom VARCHAR(30), datenaiss DATE
);
-- Classe fille
CREATE TYPE t_etudiant AS OBJECT (
num_ine VARCHAR(10), pers REF t_personne
);
-- Ensuite, si on veut intérroger la table t_etudiant, on peut faire comme ceci
SELECT T.num_ine, [Link], [Link] FROM t_etudiant T;
Collections Imbriquées
On a deux types de collections imbriquées.
Table imbriquées ou Nested Tables.
VARRAYS.
Table imbriquée
Collection illimitée, non ordonnée d’éléments de même type.
On peut pas la manipuler comme une table normale, et on aura pas son schéma
dans SGBD.
Sous Oracle, il ne peut y avoir qu’un seul niveau. C’est à dire, on peut pas
avoir des tables imbriquées dans des tables imbriquées.
Voici comment on manipule les tables imbriquées.
-- Création d'un objet t_employe et une table objet t_employes
CREATE TYPE t_employe AS OBJECT(
num_insee VARCHAR(20),
nom VARCHAR(30),
age NUMBER
);
Base de données orientée objet 3
CREATE TYPE t_employes AS TABLE OF t_employe;
-- Création de la table principale departements
CREATE TABLE departements (
num_dep NUMBER,
budget NUMBER,
employes t_employes
)
NESTED TABLE employes STORE AS tab_emp;
-- Insertion directe dans la table principale
INSERT INTO departements VALUES ( 1, 200,
t_employes(t_employe(12345, ‘Med’, 25), t_employe(2222, ‘ALi’, 28)));
-- Insertion dans une table imbriquée
-- On utilise le mot clé THE
INSERT INTO THE (SELECT employes FROM departements WHERE num_dep = 1)
VALUES(t_employe (789, ‘Omar’, 20) ) ;
VARRAYS
Collection limitée, ordonnée d’éléments de même type.
Permet d’avoir plusieurs niveaux d’imbrication.
Manipulation d’un VARRAY.
Dans une requête SQL, on manipule le VARRAY entier.
Dans un bloc PL/SQL, on manipule des éléments particuliers du VARRAY.
Voici comment on manipule les VARRAY.
-- Création d'un VARRAY qui contient 2 élements
CREATE TYPE tvadresses AS VARRAY(2) OF t_adresse ;
-- Table principale
CREATE TABLE etudiants (
id VARCHAR(10),
nom VARCHAR(30),
adresses tvadresses
) ;
-- Insertion d'un VARRAY qui contient un seul élement
INSERT INTO etudiants VALUES (12345,‘Dihia’, tvadresses(t_adresse(9,‘pointe
pescade’, ‘Alger’,16000))) ;
-- Insertion d'un VARRAY qui contient deux élements, un parmis eux est nul
INSERT INTO etudiants VALUES (9999,‘Dalia’, tvadresses(t_adresse(23,‘miramar’, ‘Alger’,16000), null));
-- Aucun VARRAY n’est créé
INSERT INTO etudiants VALUES (2340, ‘Amr’, null);
-- Mise à jour de tout le VARRAY
-- On écrase!
UPDATE etudiants
SET adresses = tvadresses(t_adresse(9,‘pointe pescade’,‘Alger’, t_adresse(25,‘Saint eugene’ ,‘Alger’, 16000))
WHERE nom = ‘Dihia’ ;
-- Mise à jour d'un seul élement du VARRAY >> PL/SQL
DECLARE
lesadr tvadresses;
BEGIN
SELECT adresses INTO lesadr FROM etudiants WHERE id = 9999 ;
-- Modification de la deuxième valeur
lesadr(2) := tadresse(‘bab el oued’, ‘Alger’) ;
-- Mise à jour de la relation
UPDATE etudiants SET adresses = lesadr WHERE id = 9999 ;
Base de données orientée objet 4
COMMIT;
END ;
Méthodes et procédures
Comme c’est du objet relationnel, on peut ajouter des méthodes et des
procédures sur les objets.
Revoir l’exemple du cours.
Base de données orientée objet 5