IT/기초 지식

[데이터베이스] 자연키(Natural key)와 대체키(Surrogate Key)

개발자 두더지 2020. 10. 23. 00:10
728x90

 DB 엔지니어라면 대체키(Surrogate Key)라는 말을 자주 들어봤을 것이다. 대체키(Surrogate Key)란 테이블의 입력 데이터의 어떤 열을 기본키(Primary Key)로 하지 않고 시스템쪽에 독립적으로 할당된 키를 의미한다(일반적으로 일련번호가 사용된다). 한편 입력 데이터 자체의 열을 기본키(Primary Key)로하는 경우를 자연키(Natural key)라고 부른다.

 대체키(Surrogate Key)는 기본적으로 불필요하다. 입력 데이터에 임의의 키가 존재하고 있다면 그것을 기본키로 사용하는 것을 보통 문제가 없으며, 오토 넘버링의 기능도 오랫동안 표준 SQL에 존재하지 않았었기 때문이다. 그러나 아래와 같은 업무요건의 경우에는 대체키(Surrogate Key)를 사용하는 것을 고려해 보는 것도 나쁘지않다.

① 입력 데이터 중 기본키가 될만한 항목이 없고 데이터가 중복되어 있는 경우

② 기본키의 값이 반복되서 사용되는 경우

③ 기본키의 체계가 변화하는 경우

 ① 의 경우는 사실 있어서는 안되는 것이다. 그러한 데이터를 테이블에 넣는 것은 틀린 것이므로, 데이터를 클리닝하여 임의가 되는 키 항목을 만들어야 한다. 그러나 고객의 요구로 그러한 최선책을 사용할 수 없을 경우 대체키가 차선책이 될 수 있을 것이다.

 자주 발생하는 경우가 ②와 의 경우이다. 예를 들어 상품 코드나 고객 코드와 같은 기본키가 반복되서 사용되는 경우는 특이하지 않다. 그리고 2019년 시점에서 '001'번호가 '포장 테이프'였다가 2020년에는 '지우개'의 의미가 되는 경우도 발생한다. 이러한 경우, 항상 최신의 코드만을 참조하면 된다는 요건이라면 그대로 자연키를 사용할 수 있지만, 시계열에 데이터를 참조하는 경우는 정합성을 얻을 수 없다.

 따라서 이러한 경우에는 대체키를 사용하는 것으로 코드의 이력정보도 정합적으로 다를 수 있다. 그리고 대체키를 이용하는 것으로 부차적인 메리트로써 자연키의 경우 복수의 열을 합쳐 임의로써 사용할 수 없는 것에 반해 1개의 열만으로 간단하게 관리할 수 있다. WHERE문의 조건 지정도 꽤 간단해진다.

 무엇보다도 이것은 어디까지나 덤으로 얻어지는 효과이므로 이것 목적만으로 대체키를 이용하는 것을 고려하는 것은 좋지 않다. 대체키를 사용하면 그 보존에 불필요한 메모리 영역을 소비하므로 논리적으로 불필요한 항목을 붙여 계산을 불투명하게 하기 때문이다. 따라서 대체키는 반드시 필요한 경우에만 사용하도록 하자.

[표] 대체키를 사용한 예시

대체키를 사용하는 경우 상품ID "001"번 재사용 기록을 저장할 수 있다.

대체키 상품ID 상품명 판매개시일 판매종료일
1 001 포장 테이프 2019 9999
2 002 2019 9999
3 003 커터 나이프 2019 9999
4 004 스티커 2019 9999
5 005 노트 2019 9999

대체키 상품ID 상품명 판매개시일 판매종료일
1 001 포장 테이프 2019 9999
2 002 2019 9999
3 003 커터 나이프 2019 9999
4 004 스티커 2019 9999
5 005 노트 2019 9999
6 001 지우개 2020 9999

 


참고자료

bunhere.tistory.com/45

gihyo.jp/dev/serial/01/sql_academy2/000304#:~:text=DB%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%AE%E6%96%B9%E3%81%AA%E3%82%89,%E8%87%AA%E7%84%B6%E3%82%AD%E3%83%BC%EF%BC%89%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82

 
728x90