PostgreSQL继承详解数据库

继承是面向对象的数据库的概念。它开启了数据库设计新的有趣的可能性大门。

让我们创建两个表:一个 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 表示法。

【注意】尽管继承经常是有用的,但是它还没有集成唯一约束或者外键,因此制约了其实用性。

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/4816.html

(0)
上一篇 2021年7月16日
下一篇 2021年7月16日

相关推荐

发表回复

登录后才能评论