본문 바로가기
Programming/SQL

[SQL] 식별자의 정의와 종류(후보키, 기본키, 대체키, 복합키, 대리키)

by 고막고막 2019. 4. 30.

식별자(Identifier)란?

한 실체(Entity)내에서 각각의 인스턴스를 유일하게 구분할 수 있는 단일 속성 또는 그룹 속성을 말한다. 실체 내에서 식별자에 동일한 값이 중복될 수 없으며, 이를 실체 무결성이라고 한다. 모든 Entity는 반드시 하나 이상의 식별자를 보유해야 하며 여러 개의 식별자를 보유하는 경우도 있다. 주로 이 식별자를 통해 해당 인스턴스의 구분이 가능해지며 검색이나 조인시 매우 중요하게 작용한다. 

 

 

후보키(Candidate Key)

실체(Entity) 내에서 각각의 인스턴스를 유일하게 구분할 수 있는 속성으로, 하나 또는 여러 개의 속성으로 구성된다. 즉, 기본키(PK)가 될 수 있는 후보 속성이다. 아래의 예에서는 '사번'과 '주민번호'가 후보키에 해당한다.

 

 

기본키(Primary Key)

실체에서 각 인스턴스를 유일하게 식별하는 데 가장 적합한 키로써 위에서 정의한 후보키 중에 선택한 하나의 속성이나 속성그룹을 말한다. 위의 예에서는 '사번'을 기본키로 설정하도록 한다.

 

후보키 중에서 기본키를 선정할 때는 다음 사항을 고려해야 할 사항

  • 해당 실체를 대표할 수 있을 것
  • 업무적으로 활용도가 높을 것
  • 길이가 짧을 것 

기본키로 선정된 후보키에는 다음과 같은 사항이 자동으로 적용된다.

  • Not Null
  • No Duplicate
  • 유일(Unique)한 클러스터드 인덱스(Clustered Index)

 

 

대체키(Alternate Key)

후보키 중에 기본키로 선정되지 않은 속성. 위의 예에서는 '주민번호'가 해당하며, 인덱스를 설정할 때 고려의 대상이 된다.

 

 

복합키(Composite Key)

하나의 속성으로는 기본키가 될 수 없는 경우는 둘 이상의 컬럼을 묶어 식별자로 정의해야 하는데, 이를 복합키라고 한다. 이슈는 복합키 중에 어떤 컬럼을 먼저 둘 것인가 하는 것이다. 컬럼을 기본키로 정의하게 되면 기본적으로 해당 컬럼에 유니크한 클러스터드 인덱스가 정의되어지며, 이럴 경우 먼저 정의한 컬럼을 기준으로 인덱스가 생성되기 때문에 복합키 중에서 주로 조회의 조건으로 사용되는 컬럼을 먼저 정의하는 것이 성능 향상을 위해 도움이 된다. 

아래의 예시는 사원에 대한 급여를 관리하기 위해 급여 내역이란 실체를 도출해 냈다. '누가, 언제, 얼마의 급여를 받았는가'에 대한 정보를 관리해야 하므로 업무상 관리해야 하는 속성으로, '지급 년 월', '사번' 이란 속성을 도출할 수 있다.

그런데 사번만으로는 기본키가 될 수 없다. 기본키라면 유일성을 보장해주어야 하는데 위의 데이터를 보면 사원에 대한 급여정보가 매달 누적 될 것이다. 만약 기본키가 사번으로 정해진다면 사번은 매달 중복이 될 것이다. 그래서 여기서는 '지급 년 월 + 사번'이 합쳐져야 각각의 인스턴스(레코드)들에 대한 유일성을 보장할 수 있다. 이것이 복합키이다. 복합키는 둘 이상의 속성으로 기본키가 구성된 것을 말한다.

 

복합키일 때 속성 간의 순서를 정하는 기준

  • 실제 현장에서 어떤 속성을 기준으로 조회하는지에 따라 결정한다

: 해당 월에 지급된 급여내역을 조회하는 경우 → '지급 년 월'을 앞에, 사번을 기준으로 각 사원의 급여내역을 조회하는 경우 →  '사번'을 앞에 둔다.

  • 만일 검색 프로세스 2가지 경우가 비슷하다면?

: 데이터가 입력되는 순서에 따라 차례로 저장 될 수 있는 속성의 순서를 결정한다. '사번'은 매월 입력되기 때문에 사번 간에는 간격이 존재한다. 그러므로 이 경우에는 '지급 년 월' 속성이 첫 번째 복합키 속성이 된다.

 

 

대리키(Surrogate Key)

대리키는 식별자가 너무 길거나 여러 개의 속성으로 구성되어 있는 경우 인위적으로 추가하는 식별자로, 인공키라고도 부른다. 한 실체에서 식별자가 여러 속성으로 구성된 경우는 데이터를 수정하거나 검색을 하는데 수행 속도가 떨어질 수 있다. 실체간에 관계가 생길 때 부모의 기본키가 자식의 외부키로 공유 되는데, 외부키가 단일해지기 때문에 조인의 속도를 향상시키기 위해 많이 사용한다.