Documentation PostgreSQL 8.1.23 > Tutoriel > Fonctionnalités avancées > Héritage | |
Transactions | Conclusion |
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. La plupart des commandes dont nous avons déjà discuté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 uniques ou les clés étrangères, ce qui limite leur utilité. Voir la Section 5.8, « Héritage » pour plus de détails.