標籤:
繼承是物件導向的資料庫的概念。它開啟了資料庫設計新的有趣的可能性大門。
讓我們建立兩個表:一個 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
3.5. PostgreSQL繼承