Des voitures et des hommes
[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 (en revanche, on n'utilisera pas le modèle imbriqué).
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 Voiture : <
type:string,
marque:string,
nbPortes:integer,
puissance:integer,
fkPropriétaire =>o tPersonne,
>
tVoiture de Voiture (#type, #marque)
tConduit (voiture =>o tVoiture, conducteur =>o tConducteur)
Rappel :
Il s'agit d'un cas simple, on adopte un héritage par les classes filles.
Héritage non complet
Classe mère non abstraite
Sans association X:N vers la classe mère
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 Voiture AS OBJECT (
type varchar(20),
marque varchar(20),
nbPortes number,
puissance number,
proprietaire REF Personne
);
/
CREATE TABLE tVoiture OF Voiture (
PRIMARY KEY (type, marque),
SCOPE FOR (proprietaire) IS tPersonne
);
CREATE TABLE tConduit (
voiture REF Voiture,
conducteur REF Conducteur,
SCOPE FOR (voiture) IS tVoiture,
SCOPE FOR (conducteur) IS tConducteur
);
Question
Implémenter la méthode Age() pour Personne et pour Conducteur.
Indice
trunc(months_between(SYSDATE, ddn)/12
Solution
CREATE OR REPLACE TYPE BODY Personne
IS
MEMBER FUNCTION age RETURN number
IS
BEGIN
RETURN trunc(months_between(SYSDATE, ddn)/12);
END;
END;
/
CREATE OR REPLACE TYPE BODY Conducteur
IS
MEMBER FUNCTION age RETURN number
IS
BEGIN
RETURN trunc(months_between(SYSDATE, ddn)/12);
END;
END;
/
Remarque :
On remarque la duplication de la méthode age
.
On peut éviter cela en utilisant l'héritage de type.
Question complémentaire (héritage de type)
L'amélioration proposée ci-après évite notamment la double déclaration de la méthode age
.
Question
Proposer une solution mobilisant l'héritage de type afin de factoriser la déclaration des attributs nom
et ddn
et la méthode age
.
Solution
CREATE OR REPLACE TYPE Personne AS OBJECT (
nom varchar(20),
ddn date,
MEMBER FUNCTION age RETURN number
) NOT FINAL;
/
CREATE OR REPLACE TYPE Conducteur UNDER Personne (
typePermis char(1),
datePermis date
);