Soit le diagramme de classe UML suivant :
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é).
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)
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
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).
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
);
Implémenter la méthode Age() pour Personne et pour Conducteur.
trunc(months_between(SYSDATE, ddn)/12
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;
/
On remarque la duplication de la méthode age
.
On peut éviter cela en utilisant l'héritage de type.
L'amélioration proposée ci-après évite notamment la double déclaration de la méthode age
.
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
.
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
);