Nous avons présenté les bases de l'utilisation de Postgres pour accéder à
vos données, nous allons maintenant examiner certaines fonctionnalités qui
distinguent Postgres des serveurs traditionnels. Ces fonctionnalités
incluent l'héritage, l'historique des valeurs (time
travel), et les valeurs de données non-atomiques (attributs
rang- et set-valued).
[1]
Créons deux classes : cities et capitals (capitales). Cette dernière est
destinée aux capitales d'états qui sont aussi des villes. Naturellement, la
classe "capitals" héritera de la classe "cities".
CREATE TABLE cities (
name text,
population float,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char2
) INHERITS (cities); |
Dans ce cas la classe "capitals"
hérite de
tous les attributs (nom, population, et altitude) de son parent
"villes". Le type de l'attribut "name" est
text, un type Postgres natif destiné aux chaînes de longueur
variable. Le type de l'attribut population est
float, un type
natif Postgres de représentation des nombres à décimaux. Les
capitales d'état ont un attribut supplémentaire, "state", qui
contient le nom de l'état où elles se trouvent. Dans Postgres une classe
peut hériter de zéro ou plus autres classes, et une requête peut référencer
toutes les instances d'une classe ou bien toutes les instances d'une classe
plus tous ses descendants.
| La hiérarchie héritage est un graphe acyclique direct. |
Par exemple, la requête suivante trouve toutes les villes qui sont situées
à une altitude de 500 pieds ou plus haut :
SELECT name, altitude
FROM cities
WHERE altitude > 500;
+----------+----------+
|name | altitude |
+----------+----------+
|Las Vegas | 2174 |
+----------+----------+
|Mariposa | 1953 |
+----------+----------+ |
Autrement dit, pour trouver les noms de toutes les villes, incluant les
capitales d'état, qui sont situées à une altitude supérieure à 500 pieds,
la requête est :
SELECT c.name, c.altitude
FROM cities* c
WHERE c.altitude > 500; |
qui retourne :
+----------+----------+
|name | altitude |
+----------+----------+
|Las Vegas | 2174 |
+----------+----------+
|Mariposa | 1953 |
+----------+----------+
|Madison | 845 |
+----------+----------+ |
Le "*" placé dans la requête après "cities"
indique que la requête sera lancée sur les villes et toutes les classes
au-dessous des villes dans la hiérarchie héritage. Beaucoup de commandes
dont nous avons déjà traité (
select,
update et
delete) gèrent cette
notation "*", ainsi que d'autres, comme
alter.