3.5. 상속
상속은 객체지향 데이터베이스에서 사용하는 개념입니다. 상속은 데이터베이스 설계 방법에 대한 새로운 가능성을 제시합니다.
cities
(도시) 테이블과 capitals
(주도 州都) 테이블 두 개를 만들어봅시다. 실 세계의 개념으로 본다면, 도시를 모두 찾아보자면, 당연히 주도도 포함되겠지요. 여기서 테이블 상속 개념은 출발합니다. 만일 전통적인 개념으로 자료구조를 설계한다면 다음과 같이 하겠지요:
CREATE TABLE capitals (
name text,
population real,
altitude int, -- (in ft)
state char(2)
);
CREATE TABLE non_capitals (
name text,
population real,
altitude int -- (in ft)
);
CREATE VIEW cities AS
SELECT name, population, altitude FROM capitals
UNION
SELECT name, population, altitude FROM non_capitals;
이렇게 하고, cities 뷰를 이용하면, 모든 도시를 찾을 수 있습니다. 하지만, 하나의 이름으로 자료를 바꾸려고 할 때는 결국 두번의 쿼리가 있어야합니다. 이 문제를 다음과 같이 풀어봅니다:
CREATE TABLE cities (
name text,
population real,
altitude int -- (in ft)
);
CREATE TABLE capitals (
state char(2)
) INHERITS (cities);
이때, capitals 테이블에서 지정한 inherits 예약어가 바로 테이블을 상속받겠다는 것을 나타냅니다. 윗 경우라면, cities 테이블의 모든 칼럼을 상속 받는 것을 의미합니다. 윗 name 칼럼의 text 자료형은 PostgreSQL에서 사용하는 고유한 가변길이 문자열 자료형입니다. PostgreSQL에서는 하나의 테이블은 자기 자신이 상위테이블 (하나도 상속 받지 않은 테이블)이 되거나 여러개의 상위 테이블을 상속받을 수 있습니다. 또한 그 테이블의 자료 조회는 하위 테이블의 모든 자료를 포함해서 조회합니다.
예를 들어, 고도가 500 ft. 보다 큰 도시들을 모두 찾을 때, 물론 이때 주도도 포함하고자 할 때는 다음과 같은 쿼리를 이용합니다:
SELECT name, altitude
FROM cities
WHERE altitude > 500;
이 쿼리의 결과는 다음과 같습니다:
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
Madison | 845
(3 rows)
이때, 주도를 빼고 검색하려면 다음과 같이 ONLY 예약어를 사용합니다:
SELECT name, altitude
FROM ONLY cities
WHERE altitude > 500;
name | altitude
-----------+----------
Las Vegas | 2174
Mariposa | 1953
(2 rows)
이 ONLY 예약어는 앞에서 이야기한 모든 자료 조작 명령 -- SELECT, UPDATE, DELETE -- 에서 그대로 적용됩니다. 물론 빠진다면, 그 테이블의 하위 테이블 모두 적용됩니다.