zoukankan      html  css  js  c++  java
  • 3.5. 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 表示法。

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

    更多信息参考http://www.infocool.net/PostgreSQL/index.htm

  • 相关阅读:
    编程的核心思维
    对编程语言的一点总结
    End Poem
    linux下的errno对照表
    C++中的三个特殊宏:__FILE__,__FUNCTION__和__LINE__
    算法——从斐波那契数列谈起(一)
    [题解][HNOI2002][Luogu P2234] 营业额统计
    用STL水平衡树的题
    浅谈C++的智能指针
    cnblog代码高亮优化(tomorrow主题)
  • 原文地址:https://www.cnblogs.com/wolaiye320/p/5572316.html
Copyright © 2011-2022 走看看