3.5. Héritage

L'héritage est un concept provenant des bases de données orientées objet. Il ouvre de nouvelles possibilités intéressantes dans la conception de bases de données.

Créons deux tables : une table villes et une table capitales. Naturellement, les capitales sont aussi des villes, donc vous voulez un moyen pour afficher implicitement les capitales lorsque vous listez les villes. Si vous êtes réellement intelligent, vous pourriez inventer ceci :

CREATE TABLE capitales (
  nom        text,
  population real,
  altitude   int,    -- (en pied)
  etat       char(2)
);

CREATE TABLE non_capitales (
  nom        text,
  population real,
  altitude   int     -- (en pied)
);

CREATE VIEW villes AS
  SELECT nom, population, altitude FROM capitales
    UNION
  SELECT nom, population, altitude FROM non_capitales;

Ceci fonctionne bien pour les requêtes, mais c'est horrible lorsque vous avez besoin de mettre à jour plusieurs lignes par exemple.

Voici une meilleure solution :

CREATE TABLE villes (
  nom        text,
  population real,
  altitude   int     -- (en pied)
);

CREATE TABLE capitales (
  etat      char(2)
) INHERITS (villes);

Dans ce cas, une ligne de capitales hérite de toutes les colonnes (nom, population et altitude) de son parent, villes. Le type de la colonne nom est text, un type natif de PostgreSQL pour les chaînes de caractères à longueur variable. Les capitales d'état ont une colonne supplémentaire, etat, qui affiche leur état. Dans PostgreSQL, une table peut hériter d'aucune ou de plusieurs autres tables.

Par exemple, la requête suivante trouve les noms de toutes les villes, en incluant les capitales des états, situées à une altitude de plus de 500 pieds :

SELECT nom, altitude
  FROM villes
  WHERE altitude > 500;

ce qui renvoie :

   nom     | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

Autrement, la requête suivante trouve toutes les villes qui ne sont pas des capitales et qui sont situées à une altitude d'au moins 500 pieds :

SELECT nom, altitude
    FROM ONLY villes
    WHERE altitude > 500;

   nom     | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

Ici, ONLY avant villes indique que la requête ne doit être lancée que sur la table villes, et non pas sur les tables sous villes suivant la hiérarchie des héritages. Beaucoup des commandes dont nous avons déjà discutées -- SELECT, UPDATE et DELETE -- supportent cette notation (ONLY).