Oracle by Alex
Home

 

Home

perf

la Pres.

technique

 

 

 Définition des objets

2.1.1. Les types abstraits de données.

    Type utilisé par une table.
    Type utilisé par un type.
    Type utilisé par un attribut d'une table relationnelle.
    Type utilisé par un attribut d'une table objet-relationnelle.


2.1.2. Les pointeurs (et les pseudo-colonnes).

    Définitions.
    Référence simple.
    Référence physique inverse.

2.1.3. Les structures imbriquées.

 

2.1.1. Les types abstraits de données.

Peuvent être utilisés par :
une ou plusieurs tables
un ou plusieurs types
un ou plusieurs attributs
Type utilisé par une table.

CREATE TYPE adresse_type AS OBJECT (norue NUMBER, rue VARCHAR2(20), ville VARCHAR2(30), code_postal VARCHAR2(10))
 
adresse_type 
norue rue ville code_postal
CREATE TABLE adresse OF adresse_type
 
Adresse
norue rue ville code_postal
    Il est impossible de stocker un objet dans un type, il faut déclarer une table objet-relationnelle sur ce type puis la remplir. C'est comme déclarer une variable au moyen d'un constructeur et puis lui assigner l'objet (comme en C++).

Type utilisé par un type.

Il est possible de définir un nouveau type avec des types de bases ou prédéfinis.

CREATE OR REPLACE TYPE adresse_type AS OBJECT (norue NUMBER, rue VARCHAR2(20), ville VARCHAR2(30), code_postal VARCHAR2(10))

CREATE OR REPLACE TYPE etudiant_type AS OBJECT (numero NUMBER, bac VARCHAR2(5), adr adresse_type)
 
etudiant_type 
numero  bac  adr 
norue rue ville code_postal
CREATE TABLE etudiant OF etudiant_type (CONSTRAINT PK_ETUD PRIMARY KEY(numero))
 
Etudiant
numero  bac  adr 
norue rue ville code_postal
Type utilisé par un attribut d'une table relationnelle.

CREATE TABLE employe (numero NUMBER PRIMARY KEY, dept VARCHAR2(5), salaire NUMBER, adr adresse_type)
 
Employé
numero  dept  salaire  adr 
norue rue ville code_postal
    Une table qui ne dépend pas d'un type n'est pas une table objet-relationnelle. Les records de la table ne sont pas considérés comme objets Oracle 8.
Non déclaré via un type ===> pas d'identificateur OID. Remarquons que 296 objets peuvent être référencés avec Oracle 8.

Type utilisé par un attribut d'une table objet-relationnelle.

CREATE OR REPLACE TYPE adresse_type AS OBJECT (norue NUMBER, rue VARCHAR2(20), ville VARCHAR2(30),  code_postal VARCHAR2(10))

CREATE TYPE employe_type AS OBJECT (numero NUMBER, dept VARCHAR2(5), salaire NUMBER, adr adresse_type)

CREATE TABLE employe OF employe_type (PRIMARY KEY (numero))
 
Employé
numero  dept  salaire  adr 
norue rue ville code_postal
    Une table qui dépend d'un type est une table objet-relationnelle.

Donc, pour avoir une table objet-relationnelle, il faut

1. définir un type complet
2. déclarer une table de ce type pour avoir son OID, plutôt que déclarer une table en utilisant des sous-types, voire des types de base, pour certains champs.
 

 

2.1.2. Les pointeurs (et les pseudo-colonnes).

Définitions :

ROWID : pseudo-colonne qui contient l'adresse physique de chaque enregistrement d'une base de données Oracle
OID : pseudo-colonne représentant l'identifiant unique que possède en Oracle 8 chaque objet (table, type, objet des tables, ...).
REF : pseudo-colonne qui contient l'identifiant unique de chaque Objet au sens Oracle (enregistrement d'une table objet-relationnelle) (Syn. pointeur)

Référence simple.

AVANTAGE : Ils sont un outil puissant car ils accèdent (de manière unidirectionnelle...) facilement à la mémoire, d'où performance.

INCONVENIENT : Les pointeurs apparaissent en abondance sous Oracle 8. Ils sont hélas, un point faible pour la sécurité du système mais ils sont surtout une source de problèmes pas toujours facile à déceler (segmentation fault).

CREATE TYPE administrateur_type AS OBJECT (nadmin VARCHAR2(5), age NUMBER, nom VARCHAR2(30))

CREATE TYPE PC_type AS OBJECT (nserie VARCHAR2(5), adresseIP VARCHAR2(15), administre REF administrateur_type)

Ces requêtes permettent d'associer à chaque PC son administrateur par pointage vers l'objet voulu.
 

    Un attribut dans un type ou une table ne doit pas faire référence à une table mais à un type.

Référence inverse physique.

Pour les créer, il faut d'abord définir un type incomplet (ici PC_type).

CREATE TYPE PC_type

CREATE OR REPLACE TYPE admin_type AS OBJECT (nadmin VARCHAR2(5), age NUMBER, nom VARCHAR2(30), machine REF PC_type)

CREATE OR REPLACE TYPE PC_type AS OBJECT (nserie VARCHAR2(5), adresseIP VARCHAR2(15), administre REF admin_type)

CREATE TABLE PC OF PC_type(PRIMARY KEY (nserie))

CREATE TABLE admin OF admin_type (CONSTRAINT pk_admin PRIMARY KEY (nadmin))

AVANTAGE : Ils sont un outil puissant.

INCONVENIENT : Difficile à gérer.

 

2.1.3. Les structures imbriquées.

Deux types de structures imbriquées sont utilisables sous Oracle 8 : les tables imbriquées (nested tables) et les tableaux prédimensionnés (VARRAY).

Une table imbriquée est une collection non ordonnée et non limitée d'éléments de même type. Ce concept permet d'abandonner le concept de première forme normale et de créer des tables au format 2NF. (Forme dans laquelle chaque attribut qui ne fait pas partie d'une clef est dépendant fonctionnellement sur chacune ; plus simplement, il suffit que les clefs ne soient constituées que d'attributs simples pour que le schéma soit en 2NF).

Un tableau prédimensionné est une collection ordonnée et limitée d'éléments de même type.

Pour les tables imbriquées :
AVANTAGE : le nombre d'éléments dans la NT (nested table) n'est pas limité. On retrouve les avantages d'une liste chaînée classique.
INCONVENIENT : un seul niveau d'imbrication.
INCONVENIENT : risque de perte de places à cause des pointeurs NULL.
Pour les VARRAY :
AVANTAGE : optimisation de la place.
AVANTAGE : imbrication possible de plusieurs tableaux avec des pointeurs.
INCONVENIENT : contrairement aux tableaux des langages classiques, l'accès aux éléments d'un VARRAY est moins performant que l'accès à ceux d'une table imbriquée.
L'accès à un objet implémenté par une table imbriquée ou par un VARRAY n'est pas transparent. Ceci est normal dans la mesure où l'utilisateur doit choisir le type voulu selon l'utilisation qu'il veut en faire. Oracle 8 permet de manipuler des enregistrements particuliers dans une table imbriquée avec un opérateur spécial. En revanche, avec les VARRAY, cet opérateur n'est pas opérationnel ; il est nécessaire d'utiliser un programme PL/SQL. Cependant, dans ce cas, l'index classique (C++, Java, ...) est bien sûr applicable.

Normalement, l'implémentation doit être transparente...