외래 키는 한 테이블의 값이 참조 대상 테이블에 실제로 존재하도록 제한하는 데이터베이스 제약이다. 문서에 작성자 번호를 저장할 때 존재하지 않는 작성자를 가리키는 실수를 막는 데 사용할 수 있다. 단순한 링크 문자열과 달리 데이터베이스가 참조 관계를 검사한다.
참조 무결성
참조 대상은 보통 기본 키나 고유하게 식별 가능한 열이다. PostgreSQL의 외래 키는 연결된 데이터 사이의 참조 무결성을 지키는 수단이다. 애플리케이션에서 존재 여부를 미리 확인하더라도 동시에 다른 요청이 데이터를 바꿀 수 있으므로 데이터베이스 제약과 역할이 다르다. 공식 외래 키 튜토리얼
문서와 댓글의 예
댓글 테이블에 문서 번호를 두고 문서 테이블을 참조하게 만들 수 있다. 그러면 존재하지 않는 문서 번호로 댓글을 저장하는 요청을 거절할 수 있다.
| 데이터 | 연결 방식 |
|---|---|
| 문서 | 자체 번호로 식별 |
| 댓글 | 댓글 번호와 대상 문서 번호 저장 |
| 댓글 조회 | 문서 번호로 범위를 제한 |
여기서 연결이 있다는 사실과 실제 화면에 함께 표시하는 일은 구분된다. 작성자 이름이나 문서 제목을 함께 가져오는 조회는 조인 등 별도의 SQL로 표현해야 한다.
삭제와 업무 규칙
참조되는 문서를 지울 때 댓글도 지울지, 삭제를 막을지, 연결을 비울지는 명시적으로 결정해야 한다. 외래 키 삭제 동작 모든 관계에 연쇄 삭제를 적용하면 기대보다 넓은 데이터가 사라질 수 있다. 보존해야 할 이력이라면 상태 변경과 물리 삭제를 구분하는 설계가 필요하다.
외래 키는 작성 권한이나 내용의 정확성을 검사하지 않는다. 사용자가 해당 문서에 댓글을 남길 수 있는지, 비공개 문서를 읽을 수 있는지는 애플리케이션의 권한 정책으로 판단한다. 데이터가 연결되어 있다는 사실만으로 공개 접근을 허용해서는 안 된다.