Des voitures et des hommes

[45 minutes]

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

Cas simples

Cas problématiques

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.

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.

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
);
AccueilExercices > Exercice : Des voitures et des hommes< PrécédentSuivant >