3.6. 상속

상속은 객체지향 데이터베이스에서 사용하는 개념입니다. 상속은 데이터베이스 설계 방법에 대한 새로운 가능성을 제시합니다.

cities (도시) 테이블과 capitals (수도) 테이블 두 개를 만들어봅시다. 실 세계의 개념으로 본다면, 도시를 모두 찾아보자면, 당연히 수도도 포함되겠지요. 여기서 테이블 상속 개념은 출발합니다. 만일 전통적인 개념으로 자료구조를 설계한다면 다음과 같이 하겠지요:

CREATE TABLE capitals (
  name       text,
  population real,
  elevation   int,    -- (in ft)
  state      char(2)
);

CREATE TABLE non_capitals (
  name       text,
  population real,
  elevation   int     -- (in ft)
);

CREATE VIEW cities AS
  SELECT name, population, elevation FROM capitals
    UNION
  SELECT name, population, elevation FROM non_capitals;

이 방식도 괜찮습니다. 하지만 자료를 조작해야하는 입장에서 본다면, 항상 두 개의 테이블을 같이 고려해야겠지요.

좀 더 나은 방법:

CREATE TABLE cities (
  name       text,
  population real,
  elevation   int     -- (in ft)
);

CREATE TABLE capitals (
  state      char(2) UNIQUE NOT NULL
) INHERITS (cities);

윗 예제는, capitals 테이블에서 지정한 inherits 예약어가 바로 테이블을 상속받겠다는 것을 나타냅니다. 윗 경우라면, cities 테이블의 모든 칼럼을 상속 받는 것을 의미합니다. 윗 name 칼럼의 text 자료형은 PostgreSQL에서 사용하는 고유한 가변길이 문자열 자료형입니다. capitals 테이블에는 주 약자를 보여주는 state 칼럼이 추가 되었습니다. PostgreSQL에서는 하나의 테이블은 자기 자신이 상위테이블 (하나도 상속 받지 않은 테이블)이 되거나 여러개의 상위 테이블을 상속받을 수 있습니다. 또한 그 테이블의 자료 조회는 하위 테이블의 모든 자료를 포함해서 조회합니다.

예를 들어, 해발고도가 500 ft. 보다 큰 도시들을 모두 찾을 때, 물론 이때 수도도 포함하고자 할 때는 다음과 같은 쿼리를 이용합니다:

SELECT name, elevation
  FROM cities
  WHERE elevation > 500;

which returns:

   name    | elevation
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
 Madison   |      845
(3 rows)

이때, 수도를 빼고 검색하려면 다음과 같이 ONLY 예약어를 사용합니다:

SELECT name, elevation
    FROM ONLY cities
    WHERE elevation > 500;

   name    | elevation
-----------+----------
 Las Vegas |     2174
 Mariposa  |     1953
(2 rows)

ONLY 예약어는 앞에서 이야기한 모든 자료 조작 명령 — SELECT, UPDATE, DELETE — 에서 그대로 적용됩니다. 물론 빠진다면, 그 테이블의 하위 테이블 모두 적용됩니다.

참고

테이블 상속 기능은 이렇게 유용함에도 불구하고, 유니크 제약조건, 참조키 같은 부분에서 그리 깔끔한 해결책을 제시하고 있지는 못합니다. 보다 자세한 사항은 5.10절 에서 다루고 있습니다.