3.6. 继承
继承是面向对象的数据库的概念。它开启了数据库设计的有趣的新的可能性。
让我们创建两个表:一个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
的所有字段(name
,population
和altitude
)。字段name
的类型text
是 PostgreSQL用于变长字符串的固有类型。州首府有一个额外的字段 state
显示其所处的州。在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
, UPDATE
和 DELETE
—都支持这个ONLY
表示法。
Note: 尽管继承经常是有用的,但是它还没有集成唯一约束或者外键,因此制约了其实用性。 参阅Section 5.8以获取更多细节。