상속은 객체지향 데이터베이스에서 사용하는 개념입니다. 상속은 데이터베이스 설계 방법에 대한 새로운 가능성을 제시합니다.
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절 에서 다루고 있습니다.