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.
Soit 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, elevation int, -- (en pied) etat char(2) ); CREATE TABLE non_capitales ( nom text, population real, elevation int -- (en pied) ); CREATE VIEW villes AS SELECT nom, population, elevation FROM capitales UNION SELECT nom, population, elevation 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.
Une meilleure solution peut être :
CREATE TABLE villes ( nom text, population real, elevation int -- (en pied) ); CREATE TABLE capitales ( etat char(2) UNIQUE NOT NULL ) INHERITS (villes);
Dans ce cas, une ligne de capitales
hérite de toutes les colonnes
(nom
, population
et
elevation
) 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. La table capitales
a une colonne supplémentaire, etat
, qui affiche
l'abréviation de cet état. Sous PostgreSQL, une
table peut hériter de zéro à plusieurs autres tables.
La requête qui suit fournit un exemple d'extraction des noms de toutes les villes, en incluant les capitales des états, situées à une elevation de plus de 500 pieds :
SELECT nom, elevation FROM villes WHERE elevation > 500;
ce qui renvoie :
nom | elevation -----------+----------- Las Vegas | 2174 Mariposa | 1953 Madison | 845 (3 rows)
À l'inverse, la requête qui suit récupère toutes les villes qui ne sont pas des capitales et qui sont situées à une élévation d'au moins 500 pieds :
SELECT nom, elevation FROM ONLY villes WHERE elevation > 500;
nom | elevation -----------+----------- 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
).
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.10 pour plus de détails.