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.