3.5. Héritage
L'héritage est un concept issu des bases de données orientées objet.
Il ouvre de nouvelles possibilités intéressantes en conception de
bases de données.
Soient deux tables : une table villes et
une table capitales. Les capitales étant
également des villes, il est intéressant d'avoir la possibilité
d'afficher implicitement les capitales lorsque les villes sont
listées. Un utilisateur particulièrement brillant peut écrire 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;
Cela fonctionne bien pour les requêtes, mais la mise à jour d'une
même donnée sur plusieurs lignes devient vite un horrible casse-tête.
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 l'état dont elles sont capitales. Sous PostgreSQL™, une table peut hériter de
zéro à plusieurs autres tables.
La requête suivante fournit un exemple de récupération des 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)
À l'inverse, la requête suivante récupère 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 exécutée
que sur la table villes, et non pas sur
les tables en dessous de villes dans la
hiérarchie des héritages. La plupart des commandes déjà évoquées --
SELECT
,
UPDATE
et
DELETE
-- supportent cette notation
(ONLY).
Note
Bien que l'héritage soit fréquemment utile, il n'a pas été
intégré avec les contraintes d'unicité et les clés étrangères, ce
qui limite son utilité. Voir la Section 5.8,
« L'héritage » pour plus de détails.