본문 바로가기

Database

외래 키(Foreign Key)

1.  '외래 키(Foreign Key)' 란 무엇인가?

외래 키는 하나의 테이블에 있는 필드(또는 필드 집합)로 다른 테이블의 기본 키(Primary Key)를 참조한다. 두 테이블간의 관계, 논리적인 연결을 생성하는데 사용된다. 데이터베이스에서 데이터 간의 관계를 명확히 하고, 데이터의 정확성과 무결성을 유지하는 역할을 한다. 외래 키 제약 조건을 설정하여 참조 무결이 위반되는 데이터의 추가, 수정, 삭제를 방지할 수 있다.

 

예시 1. 고객과 주문

  • 상황 : 고객이 온라인 쇼핑몰에서 주문을 한다.
  • DB 설계 : 'Customers' 테이블에는 고객 정보가 저장되며 'Orders' 테이블에는 주문 정보가 저장된다.
  • 외래 키의 사용 : Orders 테이블의 CustomerID(외래 키) ... Customers 테이블의 고객을 참조. 외래 키를 통해 각 주문이 어떤 고객에 속하는지를 알 수 있으며, 고객 정보를 중복해서 저장하지 않아도 된다.

예시 2. 게시판

  • 상황 : 웹사이트의 게시판. 사용자가 게시글을 작성하고 게시글에 댓글을 달 수 있는 시스템
  • DB 설계 : 'TB_BASE_BOARD' 테이블에 게시글 정보가 저장되며 'TB_BASE_COMMENTS' 테이블에는 댓글 정보가 저장된다.
  • 외래 키의 사용 : 'TB_BASE_COMMENTS' 테이블에는 'BOARD_NO'라는 외래 키가 있어 'TB_BASE_BOARD' 테이블의 게시글을 참조한다. 어떤 댓글이 어떤 게시글에 달린 댓글인지 명확히 알 수 있으며, 게시글을 기준으로 댓글을 쉽게 관리할 수 있다.

예시 3. 직원과 부서

  • 상황 : 회사에 여러 직원과 부서가 존재하며, 회사 내부의 직원들이 여러 부서에 속해있다.
  • DB 설계 : 'Employees' 테이블에는 'DepartmentID' 라는 외래 키가 있다. 이 외래 키는 'Departments' 테이블의 부서를 참조한다.
  • 외래 키의 사용 : 어떤 직원이 어떤 부서에 속해 있는지 관리하기 용이. 부서별 직원 목록도 쉽게 조회할 수 있다. 

 

2. 외래 키 작동 방식

  1. 추가 : 외래 키 필드에 값을 추가할 때, 그 값은 외래 키가 참조하는 테이블의 기본 키에 존재하는 값이어야 한다.
  2. 수정 : 외래 키를 수정할 때, 수정되는 값은 참조하는 테이블의 기본 키 값 중 하나여야 한다.
  3. 삭제 : 외래 키가 참조하는 테이블의 데이터를 삭제하려고 할 때, 참조 무결성 제약 조건에 따라 처리가 달라질 수 있다. (ex. CASCADE 옵션 설정 => 참조하는 데이터가 삭제될 때 해당 데이터를 참조하는 외래 키를 갖는 테이블의 데이터도 함께 삭제된다.)

3. 외래 키의 제약 조건

  • CASCADE : 이 옵션이 설정된 외래 키를 가진 테이블이 있다. 외래 키가 참조하는 테이블의 특정 행이 삭제될 경우, 해당 외래 키를 가진 테이블의 해당 행도 함께 삭제된다. 참조하는 테이블의 기본 키 값이 변경될 경우, 해당 외래 키를 가진 테이블에서도 자동으로 업데이트 된다.
  • SET NULL : 참조하는 테이블의 특정 행이 삭제되거나 기본 키 값이 변경될 경우, 외래 키 값을 NULL로 설정한다. 이 때 당연히 외래 키 컬럼 값은 NULL을 허용해야 한다.
  • NO ACTION : 참조하는 테이블의 특정 행에 대한 삭제 또는 업데이트가 외래 키 제약 조건을 위배하는 행위일 경우 해당 변경을 거부한다. 외래 키 관계를 위반하는 조작은 실행되지 않는다.
  • SET DEFAULT : 참조하는 테이블의 특정 행이 삭제되거나 기본 키 값이 변경될 경우, 외래 키 값을 특정 기본값으로 설정한다. 이 기본값은 외래 키 정의 시 지정해야 한다.

 

4. 현업에서 외래 키의 사용에 대하여

 

외래 키의 사용은 현업에서 데이터 무결성과 관계를 유지하는 중요한 방법 중 하나이다. 그러나 외래 키의 적용에는 장단점이 존재하기 때문에 데이터베이스의 설계와 애플리케이션 요구 사항에 따라 신중하게 사용해야 한다. 

 

[ 외래 키 사용의 장점 ]

  • 데이터 무결성 보장 : 데이터베이스 내의 데이터 무결성 유지에 도움이 된다. 참조 무결성 제약 조건을 통해 부적절한 데이터의 입력을 방지하며 데이터 간의 관계를 명확히 할 수 있다.
  • 데이터 관리의 용이성 : 외래 키를 통해 관련된 데이터를 쉽게 찾고 연결된 정보에 보다 쉽게 접근할 수 있다.
  • 표준화된 데이터베이스의 설계 : 데이터베이스 설계가 표준화되고 데이터 간의 관걔도 명확해진다. 이는 유지보수와 확장성에 큰 이점을 제공한다.

[ 외래 키 사용의 단점 ]

  • 성능 저하 문제 : 대규모 데이터를 다루는 환경에서는 외래 키의 사용으로 성능 저하가 발생할 수 있다. 데이터베이스에 데이터의 삽입, 삭제, 수정 등이 빈번히 일어날 때 관련된 모든 테이블을 체크해야 하므로 성능에 부담이 될 수 있다.
  • 복잡성 증가 : 데이터베이스의 복잡성 증가로 데이터 관리가 어려워 질 가능성이 있다. 데이터베이스 설계와 쿼리가 복잡해지고 오류 발생 시 문제의 진단과 해결에 어려움이 커진다.
  • 유연성 저하 : 외래 키는 데이터 간의 명확한 관계 정의를 강제하므로 유연성이 필요한 어플리케이션의 경우 오히려 단점이 될 수 있다. 빠르게 변화하는 비즈니스 요구사항에 대한 민첩한 대응이 어려워질 수 있다.

외래 키의 사용 여부와 범위는 프로젝트의 특성, 데이터의 복잡성, 성능 요구 사항, 유지보수와 확장성에 대한 고려에 따라 결정되어야 한다. 데이터 무결성을 최우선으로 해야 하는 경우 외래 키를 적극적으로 사용하는 것이 적합할 수 있으며, 서능 최적화나 유연성이 강조되는 프로젝트의 경우 외래 키 사용을 최소화하는 것이 적합한 전략이 될 수 있다. 이와 같이 외래 키 사용의 장단점을 모두 고려하여 프로젝트에 가장 적합한 데이터베이스 설계 전략을 강구하도록 하자.