Héritage

L'héritage est un concept provenant des bases orienté-objet. Il présente de nouvelles possibilités intéressantes concernant la modélisation des bases de données.

Créons deux tables : Une table cities et une table capitals. Naturellement, les capitales sont aussi des villes, et vous voulez indiquer les capitales quand vous affichez les villes. Si vous être réellement adroit vous pouvez inventer un schéma comme celui-ci :

CREATE TABLE capitals (
    name            text,
    population      real,
    altitude        int,    -- (in ft)
    state           char(2)
);

CREATE TABLE non_capitals (
    name            text,
    population      real,
    altitude        int     -- (in ft)
);

CREATE VIEW cities AS
    SELECT name, population, altitude FROM capitals
        UNION
    SELECT name, population, altitude FROM non_capitals;
Ceci fonctionnera autant que les requêtes le peuvent, mais risque de devenir pénible quand vous aurez besoin de mettre à jour plusieurs lignes pour nommer une seule chose.

Une meilleure solution est :

CREATE TABLE cities (
    name            text,
    population      real,
    altitude        int     -- (in ft)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);
Dans ce cas, une ligne de capitals inherits (hérite) de toutes les colonnes (name, population, et altitude) depuis ses parents, cities. Le type de la colonne name est text, un type natif PostgreSQL pour les chaînes de caractères de longueur variable. Les capitales d'état ont une colonne supplémentaire, state, qui indique leur état. Dans PostgreSQL, une table peut hériter de zéro ou plusieurs autres tables.

Par exemple, la requête suivante retrouve les noms de toutes les villes, incluant les capitales d'états, qui sont situées à une altitude supérieure à 500 ft. :

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;
qui affiche :
   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

D'un autre côté, la requête suivante retrouve toutes les villes qui ne sont pas capitales d'état et sont situées à une altitude de 500 ft ou plus :

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;
   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

Ici le ONLY avant cities indiquera que la requête sera lancée seulement sur la table cities, et non les tables au-dessous de cities dans la hiérarchie de l'héritage. Nombre de commandes dont nous avons déjà parlé -- SELECT, UPDATE et DELETE -- supportent la notation ONLY.