Zoologie

[45 minutes]

Un zoologue souhaite réaliser une base de données pour l'étude des chaînes alimentaires.

Il souhaite étudier deux populations d'animaux : les carnivores et les herbivores, sachant que les carnivores ne mangent  que des herbivores et que les herbivores, évidemment, ne mangent pas d'animaux. La base gère donc des espèces d'animaux, identifiées par leur nom (Lion, Biches, etc.). Les carnivores et les herbivores sont étudiés selon deux paramètres communs : taille moyenne et poids moyen.

Pour les herbivores, on étudie en plus le poids moyen de végétaux mangé par jour. Bien entendu le zoologue souhaite connaître également le poids moyen mangé par jour pour chaque espèce de carnivore et pour chaque espèce d'herbivore qu'il mange. Il souhaite enfin pouvoir obtenir très facilement le poids total mangé par un carnivore par jour (donc en sommant le poids de chaque herbivore mangé par jour). On fera apparaître cette opération sur le modèle.

Question

Réalisez le modèle conceptuel du problème posé.

Solution

MCD

Avec Animal classe abstraite.

Question

Réalisez le modèle logique relationnel-objet du problème (on utilisera les OID pour toutes les tables référencés).

Solution

1
Type Animal : <nom:string, poids:float, taille:float>
2
Type Carnivore hérite de Animal : <=poidsMangéParJourTotal(): float>
3
Type Herbivore hérite de Animal : <poidsMangéParJour: float>
4
tCarnivore de Carnivore (#nom)
5
tHerbivore de Herbivore (#nom)
6
7
Type Mange : <mangeur =>o tCarnivore, mangé =>o tHerbivore, poidsMangéParJour:float>
8
tMange de Mange ()
Remarque

L'impossibilité de définir une clé à partir des OID fait que l'on ne peut pas empêcher les doublons mangeur/mangé dans Mange.

Question

Implémentez le modèle relationnel-objet en SQL3 sous Oracle (sans implémenter de méthode).

Solution

1
CREATE TYPE Animal AS OBJECT(
2
  nom varchar2(50), 
3
  poids float, 
4
  taille float
5
) NOT FINAL ;
6
/
7
CREATE TYPE Carnivore UNDER animal(
8
  MEMBER FUNCTION poidsMangeParJourTotal RETURN float 
9
);
10
/
11
CREATE TYPE Herbivore UNDER animal(
12
  poidsMangeParJour float
13
);
14
/
15
CREATE TYPE Mange AS OBJECT(
16
  mangeur REF Carnivore, 
17
  mange REF Herbivore,
18
  poidsMangeParJour float
19
);
20
/
21
CREATE TABLE tCarnivore OF Carnivore(
22
  PRIMARY KEY(nom)
23
);
24
/
25
CREATE TABLE tHerbivore OF Herbivore(
26
  PRIMARY KEY(nom)
27
);
28
/
29
CREATE TABLE tMange OF Mange(
30
  SCOPE FOR(mangeur) IS tCarnivore,
31
  SCOPE FOR(mange) IS tHerbivore
32
);

Question

Implémentez la méthode permettant de calculer le poids total d'herbivore mangé par un carnivore par jour.

Solution

1
CREATE TYPE BODY Carnivore
2
IS
3
  MEMBER FUNCTION poidsMangeParJourTotal RETURN float
4
  IS
5
    vTotal float;
6
  BEGIN
7
    SELECT SUM(tm.poidsMangeParJour) INTO vTotal
8
    FROM tMange tm
9
    WHERE tm.mangeur.nom=self.nom;
10
    RETURN vTotal;
11
  END;
12
END;

Question

Écrivez une requête qui permet de retourner tous les carnivores, triés par leur poids, avec le poids total d'herbivore qu'ils mangent par jour.

Solution

1
SELECT tc.nom, tc.poidsMangeParJourTotal()
2
FROM tCarnivore tc
3
ORDER BY tc.poids;

Question

Proposez et implémentez une solution d'optimisation pour améliorer les performances de la requête précédente. Justifiez votre choix et expliquez, éventuellement à l'aide d'un petit schéma ou d'un exemple, pourquoi l'exécution sera améliorée.

Solution

1
CREATE INDEX TCARNIVORE_POIDS_IDX ON tCarnivore (poids);