3.5. 繼承

繼承是面向對象的數據庫的概念。它開啟了數據庫設計新的有趣的可能性大門。

讓我們創建兩個表:一個表 cities 和一個表 capitals。自然,首府(capital)也是城市(cities), 因此在列出所有城市時你想要某種方法隱含地顯示首府。 如果你已經很高明了,那麼你可能會創造類似下面這樣的模式:

CREATE TABLE capitals (
    name            text,
    population      real,
    altitude        int,    -- (單位是英尺)
    state           char(2)
);

CREATE TABLE non_capitals (
    name            text,
    population      real,
    altitude        int     -- (單位是英尺)
);

CREATE VIEW cities AS
    SELECT name, population, altitude FROM capitals
        UNION
    SELECT name, population, altitude FROM non_capitals;

如果只是查詢,那麼這個方法運轉得很好,但是如果你需要更新某幾行, 那這個方法就很難看了。

一種更好的方法是:

CREATE TABLE cities (
    name            text,
    population      real,
    altitude        int     -- (單位是英尺)
);

CREATE TABLE capitals (
    state           char(2)
) INHERITS (cities);

在這個例子裡,capitals 的一行繼承所有來自它的父表cities 的所有字段(namepopulation,和 altitude)。 字段 name 的類型是 text, 是 PostgreSQL 用于變長字符串的固有類型。 州首府有一個額外的字段,州,顯示所處的州。在 PostgreSQL 裡,一個表可以從零個或者更多其它表中繼承過來。

比如,下面的查詢找出所有海拔超過 500 英尺的城市的名字, 包括州首府:

SELECT name, altitude
    FROM cities
    WHERE altitude > 500;

它返回:

   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

另外一方面,下面的查詢找出所有不是州首府並且位于海拔大于或等于 500 英尺的城市:

SELECT name, altitude
    FROM ONLY cities
    WHERE altitude > 500;

   name    | altitude
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

這裡的 cities 前面的 ONLY 指示系統只對 cities 表運行查詢,而不包括繼承級別中低于 cities 的表。 許多我們已經討論過的命令 -- SELECT, UPDATEDELETE -- 支持這個 ONLY 表示法。