Postgresql 中文操作指南

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) UNIQUE NOT NULL
) INHERITS (cities);

在这种情况下,capitals 的一行 inheritsparent 的所有列(namepopulationelevation )。列 name 的类型是 text,一种变长字符字符串的原生 PostgreSQL 类型。capitals 表具有一个额外的列 state,它显示其状态缩写。在 PostgreSQL 中,一张表可以从零个或多个其他表继承。

例如,以下查询将找到位于高过 500 英尺高度的所有城市的名称,包括州首府:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

返回:

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

另一方面,以下查询将找到所有不是州首府且位于高过 500 英尺高度的城市:

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

这里的 ONLY 位于 cities 之前,表明只应针对 cities 表运行查询,而不是位于继承层次结构中 cities 以下的表。我们已经讨论过的许多命令——SELECTUPDATEDELETE——都支持此 ONLY 标记。

Note

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