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

1
Type Personne : <
2
  nom:string,
3
  ddn:date,
4
  =age():entier
5
>
6
tPersonne de Personne (#nom)
7
8
Type Conducteur : <
9
  nom:string,
10
  ddn:date,
11
  typePermis:{A,B,E},
12
  datePermis:date
13
  =age():entier
14
>
15
tConducteur de Conducteur (#nom)
16
17
Type Voiture : <
18
  type:string,
19
  marque:string,
20
  nbPortes:integer,
21
  puissance:integer,
22
  fkPropriétaire =>o tPersonne,
23
>
24
tVoiture de Voiture (#type, #marque)
25
26
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

Cas simples

Cas problématiques

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

1
CREATE OR REPLACE TYPE Personne AS OBJECT (
2
  nom varchar(20),
3
  ddn date,
4
  MEMBER FUNCTION age RETURN number
5
);
6
/
7
CREATE TABLE tPersonne OF Personne (
8
  PRIMARY KEY (nom)
9
);
10
11
CREATE OR REPLACE TYPE Conducteur AS OBJECT(
12
  nom varchar(20),
13
  ddn date,
14
  typePermis char(1),
15
  datePermis date,
16
  MEMBER FUNCTION age RETURN number  
17
);
18
/
19
CREATE TABLE tConducteur OF Conducteur (
20
  PRIMARY KEY (nom),
21
  CHECK (typePermis IN ('A','B','E'))
22
);
23
24
CREATE OR REPLACE TYPE Voiture AS OBJECT (
25
  type varchar(20),
26
  marque varchar(20),
27
  nbPortes number,
28
  puissance number,
29
  proprietaire REF Personne
30
);
31
/
32
CREATE TABLE tVoiture OF Voiture (
33
  PRIMARY KEY (type, marque),
34
  SCOPE FOR (proprietaire) IS tPersonne
35
);
36
37
CREATE TABLE tConduit (
38
  voiture REF Voiture,
39
  conducteur REF Conducteur,
40
  SCOPE FOR (voiture) IS tVoiture,
41
  SCOPE FOR (conducteur) IS tConducteur
42
);

Question

Implémenter la méthode Age() pour Personne et pour Conducteur.

Indice

1
trunc(months_between(SYSDATE, ddn)/12

Solution

1
CREATE OR REPLACE TYPE BODY Personne
2
IS 
3
  MEMBER FUNCTION age RETURN number
4
  IS
5
  BEGIN 
6
    RETURN trunc(months_between(SYSDATE, ddn)/12);
7
  END; 
8
END;
9
/
10
CREATE OR REPLACE TYPE BODY Conducteur
11
IS 
12
  MEMBER FUNCTION age RETURN number
13
  IS
14
  BEGIN 
15
    RETURN trunc(months_between(SYSDATE, ddn)/12);
16
  END; 
17
END;
18
/
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

1
CREATE OR REPLACE TYPE Personne AS OBJECT (
2
  nom varchar(20),
3
  ddn date,
4
  MEMBER FUNCTION age RETURN number
5
) NOT FINAL;
6
/
7
CREATE OR REPLACE TYPE Conducteur UNDER Personne (
8
  typePermis char(1),
9
  datePermis date
10
);