3.6. Inheritance

继承是面向对象数据库中的一个概念。它为数据库设计开辟了有趣的新可能性。

让我们创建两个表:一个表cities和一个表capitals。自然地,首都也是城市,因此当您列出所有城市时,您需要某种方式隐式显示首都。如果您真的很聪明,可以发明这样的方案:

CREATE TABLE capitals (
  name       text,
  population real,
  elevation  int,    -- (in ft)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

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

就查询而言,这种方法行之有效,但是当您需要更新几行时,它变得很难看。

更好的解决方案是:

CREATE TABLE cities (
  name       text,
  population real,
  elevation  int     -- (in ft)
);

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

在这种情况下,从其* parent * cities的所有列(namepopulationelevation)中继承了capitals行。列name的类型是text,这是 PostgreSQL 的本机类型,用于可变长度的字符串。State 首府还有一个额外的列state,显示其 State 名。在 PostgreSQL 中,一个表可以从零个或多个其他表继承。

例如,以下查询查找海拔超过 500 英尺的所有城市(包括 State 首府)的名称:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

which returns:

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

另一方面,以下查询将查找非 State 首府且海拔超过 500 英尺的所有城市:

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;
name    | elevation
-----------+-----------
 Las Vegas |      2174
 Mariposa  |      1953
(2 rows)

在此,在cities之前的ONLY表示查询应仅在cities表上运行,而不应在继承层次结构中在cities以下的表上运行。我们已经讨论过的许多命令SELECTUPDATEDELETE支持此ONLY表示法。

Note

尽管继承通常是有用的,但它尚未与唯一的约束或外键集成在一起,这限制了它的实用性。有关更多详细信息,请参见Section 5.9