Des voitures et des hommes de collection
[45 minutes]
Soit le diagramme de classe UML suivant :
Question
A partir de ce modèle conceptuel établissez un modèle logique en relationnel-objet.
On utilisera des tables d'objets et les OID pour effectuer les références, ainsi qu'une table imbriquée pour gérer l'association N:M comme une collection de référence à des OID.
On privilégiera la table Voiture, qui sera au centre des requêtes posées à la BD.
Solution
Type Personne : <
nom:string,
ddn:date,
=age():entier
>
tPersonne de Personne (#nom)
Type Conducteur : <
nom:string,
ddn:date,
typePermis:{A,B,E},
datePermis:date
=age():entier
>
tConducteur de Conducteur (#nom)
Type RefConducteur : <refConducteur =>o tConducteur>
Type ListeRefConducteur : collection de <RefConducteur>
Type Voiture : <
type:string,
marque:string,
nbPortes:integer,
puissance:integer,
refPropriétaire =>o tPersonne,
refConducteurs:ListeRefConducteur
>
tVoiture de Voiture (#type, #marque)
Question
Proposer une implémentation sous Oracle de votre modèle logique (sans implémenter les méthodes et sans utiliser l'héritage de type).
Solution
CREATE OR REPLACE TYPE Personne AS OBJECT (
nom varchar(20),
ddn date,
MEMBER FUNCTION age RETURN number
);
/
CREATE TABLE tPersonne OF Personne (
PRIMARY KEY (nom)
);
CREATE OR REPLACE TYPE Conducteur AS OBJECT(
nom varchar(20),
ddn date,
typePermis char(1),
datePermis date,
MEMBER FUNCTION age RETURN number
);
/
CREATE TABLE tConducteur OF Conducteur (
PRIMARY KEY (nom),
CHECK (typePermis IN ('A','B','E'))
);
CREATE OR REPLACE TYPE RefConducteur AS OBJECT (refConducteur REF Conducteur);
/
CREATE OR REPLACE TYPE ListeRefConducteur AS TABLE OF RefConducteur;
/
CREATE OR REPLACE TYPE Voiture AS OBJECT (
type varchar(20),
marque varchar(20),
nbPortes number,
puissance number,
refProprietaire REF Personne,
refConducteurs ListeRefConducteur
);
/
CREATE TABLE tVoiture OF Voiture (
PRIMARY KEY (type, marque),
SCOPE FOR (refProprietaire) IS tPersonne
)
NESTED TABLE refConducteurs STORE AS ntRefConducteurs;
Remarque :
On notera que le choix d'implémentation de fkConducteurs en collection de références à des OID nous empêche dans l'implémentation sous Oracle de définir le SCOPE FOR et donc de contraindre l'intégrité référentielle à la table tConducteur. Dans le cas présent ce n'est pas préjudiciable dans la mesure où seule la table tConducteur contient des objets Conducteur.
Question
Insérer une voiture, un propriétaire et deux conducteurs dans le base de données.
Solution
DECLARE
c1 REF Conducteur;
c2 REF Conducteur;
p1 REF Personne;
BEGIN
INSERT INTO tPersonne (nom) VALUES ('Al');
SELECT REF(p) INTO p1
FROM tPersonne p
WHERE nom='Al';
INSERT INTO tConducteur (nom, typePermis) VALUES ('Bob', 'A');
SELECT REF(c) INTO c1
FROM tConducteur c
WHERE nom='Bob';
INSERT INTO tConducteur (nom, typePermis) VALUES ('Charlie', 'B');
SELECT REF(c) INTO c2
FROM tConducteur c
WHERE nom='Charlie';
INSERT INTO tVoiture (type, marque, refProprietaire, refConducteurs)
VALUES ('Superstar', 'S12', p1, ListeRefConducteur(RefConducteur(c1),RefConducteur(c2)));
END;
Question
Afficher toutes les voitures avec les personnes qui les possèdent et les conduisent.
Solution
SELECT v.type, v.marque, v.refProprietaire.nom, c.refConducteur.nom
FROM tVoiture v, TABLE(v.refConducteurs) c;