(주, 흔히 외래키라고 옮기기는 하는데, 외래열쇠라고 하는 것도 웃기고, 그냥 영문 그대로 쓰기로 했습니다)
2장에서 사용한 weather
, cities
테이블의 관계를 다시 한 번 살펴봅시다. 이 두 테이블 간에 아무른 관계 조건이 없다고 가정한다면, 다음과 같은 문제점들이 발생할 것입니다. 두 테이블을 도시명으로 조인해서 자료를 찾고자 하는데, inner join 일 경우는 사용자가 한 테이블에서 도시명을 잘못 입력했다면, 그 자료는 완벽하게 찾을 수 없는 사태가 발생하겠지요. 또 한 테이블에서 도시명을 바꾸었을 경우도 그렇게 될 것이고, 또 cities 테이블에서 특정 도시 정보가 삭제가 되어버리면 weather 테이블 안에 있는 그 도시의 날씨 정보가 전혀 쓸 모 없게 되어버립니다. 그래서, weather 테이블에 자료를 입력할 때는 반드시 cities 테이블에 있는 도시명을 사용해야지만 입력할 수 있도록 해야겠다고 테이블 관계를 다시 정의합니다. 이것을 RDBMS 용어로 참조 무결성(referential integrity) 이라고 합니다. 이것을 구현하기 위해서 단순하게 생각해서 weather 테이블에 자료를 입력하기 전에, 먼저 입력될 도시명이 cities 테이블에 있는지 살펴보고 있다면 입력작업을 계속 진행하고, 없다면 입력작업은 중지하도록 프로그램 만들 수 있겠지요. 처음에 아무런 참조 무결성 조건이 없는 상태보다는 좀 더 안전해졌지만, 아직도 많은 문제점들을 안고 있습니다 (앞에서 이야기한 update, delete 관련 작업에서). 이런 문제를 PostgreSQL에서는 다음과 같이 간단히 Foreign Key를 지정함으로 해결할 수 있습니다:
CREATE TABLE cities (
city varchar(80) primary key,
location point
);
CREATE TABLE weather (
city varchar(80) references cities,
temp_lo int,
temp_hi int,
prcp real,
date date
);
두 테이블을 다시 만들고 다음과 같이 입력하면:
INSERT INTO weather VALUES ('Berkeley', 45, 53, 0.0, '1994-11-28');
ERROR: <unnamed> referential integrity violation
- key referenced from weather not found in cities
이렇게 오류를 내면서 입력작업이 중지됩니다. <unnamed> 제약조건이 참조 무결성 조건에 위배 되었다 - weather 에서 지정한 key들 cities 에서 못 찾았다. 이런 뜻입니다.
foreign key 기능은 응용 프로그램에서 해야할 일들을 대폭 줄여줌과 동시에 자료의 관계성을 보다 견고하게 만들어줍니다. foreign key 기능은 여기서 언급한 것보다 훨씬 많은 것을 제공하고 있습니다. 이 자습서에서 그 세세한 기능들에 대해서는 언급하지 않겠습니다. 자세한 사항은 사용자 안내서를 참조하십시오.
(주, foreign key의 사용의 시스템의 속도를 저하시키고, 유지 보수가 어렵기 때문에 가능한 한 사용하지 않는 것이 좋다고 혹자들은 이야기 합니다. 하지만, 그 반대로 잘 만들어진 foreign key는 확실히 응용프로그램의 코딩량을 줄여주며, 자료를 안전하게 관리할 수 있도록 합니다. - 아주 중요한 이야기임, 시험에 나옴)
그래서, 이 부분에 대해서 꼭 사용자 안내서를 읽어가면서 꼼꼼히 공부해 둡시다.