coding base/DataBase

[DB] 기본키와 외래키

ddo04 2024. 4. 10. 20:31
728x90
  • 데이터베이스 설계를 위해 반드시 이해해야 할 개념 중의 하나가 기본키(primary key)와 외래키(foreign key)이다.
  • DBMS를 구현해야 하는 입장에서 보면 중복된 튜플이 삽입되는지를 확인하는 것은 쉬운 일이 아님
  • 1번 튜플이 삽입되는 경우는 이미 존재하는 모든 튜플에 대해 모든 컬럼이 같은지를 일일이 검사해보면 중복 여부를 알 수 있지만, 튜플 수가 수십만 개에 달하는 경우는 비교 시간이 매우 오래 걸리기 때문에 현실적인 방법이 아님
  • 2번 튜플의 경우는 의미적 중복이지만 데이터의 의미를 이해할 수 없는 DBMS로서는 2번 튜플이 의미적으로 중복인지를 알아낼 방법이 없음
후보키 (candidate key)란 테이블에서 각 튜플을 구별하는 데 기준이 되는 하나 혹은 그 이상의 컬럼들의 집합
< 후보키는 테이블에 있는 각 튜플을 고유하게 식별 가능>

 

  • DBMS는 새로운 튜플이 릴레이션에 삽입될 때 새로운 튜플의 후보키 값이 기존의 튜플들의 후보키 값과 동일한지 여부를 비교하여 중복 여부를 확인
  • 후보키 값의 비교는 모든 컬럼들을 비교하여 보는 것에 비헤 시간이 절약되고, 인덱스 기법을 이용하면 매우 빠른 시간에 중복 여부를 알아낼 수 있음
  • 1, 2번 튜플 모두 후보키 값이 이미 존재하고 있으므로 중복으로 간주하여 DBMS는 삽입 연산을 거절하게 됨
  • 키는 일반적으로 테이블이 생성될 때 지정함

 

  • 후보키 (candidate key)는 기본키 (primary key)와 대체키 (alternate key)로 구분 됨

 

 

 

  • 설계자는 후보키 중 어느 것을 튜플을 구분하는 기준으로 사용 할지를 선택해야 하는데 이때 선택한 후보키를 기본키, 선택되지 않은 후보키를 대체키라고 함
  • 후보키 중 어느 것을 기본키로 정할 것인가에는 정해진 규칙은 없으나 대체로 데이터의 길이가 짧고 현실세계에서 빈번히 이용하는 컬럼을 기본키로 정한다
  • 후보키, 기본키, 대체키와 더불어서 키와 관련된 용어가 하나 더 있는데 그것은 복합키 (composite key)
  • 릴레이션들은 하나의 컬럼이 후보키의 역할을 하지만 어떤 릴레이션에서는 두 개 이상의 컬럼이 합쳐져야만 후보키의 역할을 할 수 있음
  • 두 개 이상의 컬럼이 모여 키의 역할을 하는 경우를 복합키라고 부름

 

  • 튜플에서 보는 바와 같이 한 학생은 여러 동아리에 가입하는 것이 가능하다
  • 두 컬럼의 집합 {sid, club}은 후보키가 될 수 있으며 두 개 이상의 컬럼이 합쳐져 후보키의 역할을 하므로 복합키임
  • 복합키의 극단적인 경우는 테이블의 모든 컬럼을 합쳐야 후보키의 역할을 하는 경우

 

 
 
  • 두 컬럼의 집합 {sdate, mode}은 키가 될 수 없는 것임
  • 여러 컬럼의 조합에 대해 검토해보면 결국 모든 컬럼을 조합해야만 키의 역할을 할 수 있게 됨\

 

  • 후보키는 하나의 테이블 내에서 튜플이 중복되지 않음을 보장하는 수단
  • 테이블 간의 데이터의 일치와 무결성을 보증해주는 수단이 외래키 (foreign key)
  • 사원 테이블은 부서에 대한 여러 정보를 포함하는 대신 정보를 찾을 수 있는 키를 가지고 있는 셈
  • 외래키는 참조하는 테이블 (사원 테이블)과 참조되는 테이블 (부서 테이블)의 연결고리 역할을 함

 

 

 

 

 

  • 이 튜플이 삽입된다면 데이터의 무결성에 문제가 생김
  • 사원 테이블에 외래키가 설정되어 있다면 DBMS는 튜플이 삽입될 때 부서 테이블을 찾아가서 900번 부서가 있는지를 확인하게 되고 없는 것을 확인하면 튜플의 삽입을 거절함으로써 데이터의 무결성을 유지할 수 있음

 

  • 참조되는 쪽 테이블의 튜플이 삭제되거나 기본키 값이 변경되므로 해서 참조하는 쪽 테이블에 무결성이 깨어지게 되면 이를 막기 위해 DBMS는 다음과 같이 몇 가지 조치를 취할 수 있음

1. 제한 (restricted)

  • 삭제하려는 튜플의 부서번호 값을 사원 테이블에서 가지고 있는 튜플이 있으면 삭제 연산을 거절함

2. 연쇄 (cascade)

  • 삭제 연산을 수행한 뒤 삭제된 부서번호 값을 갖는 사원 테이블의 튜플도 함께 삭제
  • 또 다른 테이블이 사원 테이블을 참조하고 있다면 삭제된 사원의 사원번호 값을 가지고 있는 튜플을 삭제함
  • 참조 관계를 따라가면서 연쇄적으로 관련된 튜플들을 삭제함

3. 널값으로 대체 (nullify)

  • 삭제 연산을 수행한 뒤 삭제된 부서번호 값을 갖는 사원 테이블의 튜플에서 부서번호를 null값으로 변경
  • 외래키를 통해 두 테이블 간의 데이터 무결성을 유지하는 것을 '참조 무결성 제약조건'이라고 함

 

 

사용한 책 : 데이터베이스 설계 및 구축