데이터베이스의 세계는 수많은 정보가 저장된 거대한 공간과 같습니다. 이 공간에서 우리가 원하는 데이터를 정확하고 빠르게 찾아내고, 데이터 간의 관계를 명확하게 정의하여 정보의 신뢰도를 보장하기 위해 반드시 필요한 것이 바로 ‘키(Key)’입니다. 키는 단순히 데이터를 구분하는 식별자를 넘어, 데이터의 무결성을 지키고, 중복을 방지하며, 관계형 데이터베이스의 핵심적인 구조를 떠받치는 가장 중요한 기둥입니다.
많은 분들이 기본키(Primary Key)와 외래키(Foreign Key)는 익숙하게 들어보셨겠지만, 이들의 관계와 근간을 이루는 슈퍼키(Super Key), 후보키(Candidate Key), 대체키(Alternate Key)의 개념까지 완벽하게 이해하는 것은 데이터베이스를 깊이 있게 다루기 위한 필수 과정입니다. 이 키들은 각각 독립적인 개념이 아니라, 가장 넓은 범위인 슈퍼키에서부터 시작해 점차 구체화되고 선택되는 유기적인 관계를 맺고 있습니다. 이번 글에서는 이 다섯 가지 키의 개념을 명확히 정의하고, 이들이 어떻게 서로 영향을 주고받으며 데이터베이스의 질서를 만들어가는지 구체적인 예시와 함께 하나하나 파헤쳐 보겠습니다.
슈퍼키 (Super Key): 유일성을 만족하는 모든 속성의 조합
데이터베이스 키의 여정은 가장 포괄적인 개념인 슈퍼키에서 시작됩니다. 슈퍼키는 테이블 내의 각 행(Row 또는 튜플)을 유일하게 식별할 수 있는 하나의 속성(Attribute) 또는 속성들의 집합을 의미합니다. 슈퍼키를 이해하는 핵심 단어는 ‘유일성(Uniqueness)’입니다. 즉, 슈퍼키로 지정된 속성(들)의 값은 테이블 내에서 절대 중복되지 않아야 합니다.
예를 들어, 아래와 같은 ‘학생’ 테이블이 있다고 가정해 봅시다.
| 학번 | 주민등록번호 | 이름 | 학년 | 전공 | 이메일 |
| 1001 | 950101-1234567 | 김민준 | 3 | 컴퓨터공학 | mj.kim@email.com |
| 1002 | 960315-2345678 | 이서연 | 2 | 경영학 | sy.lee@email.com |
| 1003 | 950101-2121212 | 박도윤 | 3 | 컴퓨터공학 | dy.park@email.com |
| 1004 | 971120-1456789 | 최지우 | 1 | 디자인 | jw.choi@email.com |
이 테이블에서 각 학생을 유일하게 구별할 수 있는 속성 또는 속성의 조합은 무엇이 있을까요?
{학번}: 학번은 모든 학생에게 고유하게 부여되므로 각 학생을 식별할 수 있습니다. 따라서{학번}은 슈퍼키입니다.{주민등록번호}: 주민등록번호 역시 대한민국 국민이라면 모두 고유한 값을 가지므로 슈퍼키가 될 수 있습니다.{이메일}: 이메일 주소 또한 일반적으로 개인마다 고유하므로 슈퍼키의 자격이 있습니다.{학번, 이름}:{학번}만으로도 이미 유일성이 보장되지만, 여기에 다른 속성인{이름}을 추가한 조합 역시 유일성이 깨지지 않습니다. 따라서{학번, 이름}도 슈퍼키입니다.{주민등록번호, 전공}:{주민등록번호}만으로 유일성이 보장되므로, 여기에{전공}을 추가해도 여전히 슈퍼키입니다.{이름, 전공}: ‘컴퓨터공학’과에 ‘김민준’이라는 학생이 또 있을 수 있으므로{이름, 전공}조합은 슈퍼키가 될 수 없습니다. 동명이인이 존재할 가능성을 배제할 수 없기 때문입니다.
이처럼 슈퍼키는 유일성을 만족하는 모든 조합을 의미하기 때문에, 그 개수가 매우 많을 수 있습니다. {학번}, {학번, 이름}, {학번, 전공}, {학번, 이름, 전공} … 등 유일성을 보장하는 속성을 하나라도 포함하고 있다면 모두 슈퍼키가 됩니다. 하지만 이 모든 슈퍼키를 식별자로 사용하기에는 불필요한 속성들이 포함되어 있어 비효율적입니다. 그래서 우리는 이 중에서 가장 간결한 조합을 찾아야 할 필요가 생깁니다.
후보키 (Candidate Key): 최소한의 속성으로 유일성을 만족하는 정예 멤버
후보키는 슈퍼키 중에서 더 이상 속성을 줄일 수 없는, 즉 ‘최소성(Minimality)’을 만족하는 키를 말합니다. 슈퍼키가 ‘유일성’만을 조건으로 하는 넓은 개념이었다면, 후보키는 ‘유일성’과 ‘최소성’이라는 두 가지 까다로운 조건을 모두 만족해야 하는 정예 멤버인 셈입니다.
최소성이란, 키를 구성하는 속성 중 어느 하나라도 제거하면 더 이상 유일성을 만족하지 못하는 상태를 의미합니다.
다시 ‘학생’ 테이블의 예시로 돌아가 보겠습니다. 위에서 찾은 슈퍼키들 중에서 어떤 것이 후보키가 될 수 있을까요?
{학번}: 유일성을 만족합니다. 여기서 속성을 더 제거할 수 없으므로(속성이 하나뿐이므로) 최소성도 만족합니다. 따라서{학번}은 후보키입니다.{주민등록번호}: 유일성을 만족하고, 속성이 하나이므로 최소성도 만족합니다. 따라서{주민등록번호}도 후보키입니다.{이메일}: 유일성을 만족하고, 속성이 하나이므로 최소성도 만족합니다. 따라서{이메일}도 후보키입니다.{학번, 이름}: 이 조합은 슈퍼키이지만, 후보키는 될 수 없습니다.{이름}속성을 제거해도 남은{학번}만으로 유일성이 충분히 보장되기 때문입니다. 즉, 최소성을 만족하지 못합니다.{주민등록번호, 전공}: 이 조합 역시{전공}속성이 없어도{주민등록번호}만으로 유일하므로 최소성을 위반하여 후보키가 될 수 없습니다.
만약, 어떤 학교에서 {학년, 반, 번호} 세 가지 속성이 합쳐져야만 학생을 유일하게 식별할 수 있다고 가정해 봅시다. 이 경우 {학년, 반, 번호}는 슈퍼키가 됩니다. 여기서 ‘학년’ 하나만 빼면 같은 반에 같은 번호를 가진 다른 학년 학생이 있을 수 있어 유일성이 깨지고, ‘반’이나 ‘번호’를 빼도 마찬가지입니다. 따라서 이 조합은 최소성을 만족하므로 후보키가 될 수 있습니다.
결론적으로 ‘학생’ 테이블에서는 {학번}, {주민등록번호}, {이메일} 이렇게 세 개의 후보키를 찾을 수 있습니다. 이들은 모두 테이블의 대표 식별자가 될 자격이 있는 ‘후보’들입니다.
기본키 (Primary Key): 후보키 중에서 선택된 단 하나의 대표
기본키는 후보키 중에서 데이터베이스 설계자가 선택한 단 하나의 ‘대표’ 키입니다. 후보키들은 모두 테이블의 각 행을 유일하게 식별할 수 있는 자격이 있지만, 이들 중 가장 대표성이 있고, 데이터 관리에 용이하며, 자주 사용될 것이라 판단되는 키를 기본키로 지정합니다.
기본키는 다음과 같은 매우 중요한 특징을 가집니다.
- 유일성(Uniqueness)과 최소성(Minimality): 후보키에서 선택되었으므로 당연히 두 가지 특성을 모두 만족합니다.
- Not Null: 기본키로 지정된 속성은 절대 NULL 값을 가질 수 없습니다. 식별자 정보가 비어있다는 것은 논리적으로 말이 되지 않기 때문입니다.
- 불변성(Immutability): 기본키의 값은 자주 변경되지 않아야 합니다. 만약 기본키 값이 계속 변경된다면, 이 키를 참조하는 다른 데이터들과의 관계가 불안정해질 수 있습니다.
‘학생’ 테이블의 후보키 {학번}, {주민등록번호}, {이메일} 중에서 무엇을 기본키로 선택하는 것이 가장 합리적일까요?
{주민등록번호}: 법적으로 고유하며 절대 중복되지 않는 강력한 후보입니다. 하지만 주민등록번호는 민감한 개인정보이므로 보안에 매우 취약하며, 외부에 노출되어서는 안 됩니다. 또한, 국적이 없는 외국인 학생의 경우 주민등록번호가 없을 수 있습니다. 따라서 기본키로는 부적절할 수 있습니다.{이메일}: 일반적으로는 고유하지만, 사용자가 이메일 주소를 변경할 가능성이 있습니다. 기본키는 불변성을 지향해야 하므로, 변경 가능성이 있는 이메일 주소는 좋은 기본키라고 보기 어렵습니다.{학번}: 각 학생에게 학교가 부여하는 고유한 번호로, NULL 값이 될 수 없으며, 졸업할 때까지 변하지 않는 값입니다. 개인정보 노출 위험도 없으며, 다른 테이블(예: 수강신청 테이블)에서 학생을 참조할 때 사용하기에도 간결하고 명확합니다.
따라서 대부분의 설계자는 이 경우 {학번}을 기본키로 선택할 것입니다. 이처럼 기본키는 단순히 유일한 값을 넘어, 데이터의 안정성, 간결성, 비즈니스 로직상의 대표성 등을 종합적으로 고려하여 신중하게 선택해야 합니다.
대체키 (Alternate Key): 기본키가 되지 못한 나머지 후보들
대체키는 이름 그대로 기본키를 ‘대체’할 수 있는 키입니다. 즉, 후보키 중에서 기본키로 선택되지 않고 남은 키들을 대체키라고 부릅니다. 대체키 역시 후보키이므로 유일성과 최소성을 모두 만족하며, 각 행을 유일하게 식별할 수 있는 능력을 가지고 있습니다.
‘학생’ 테이블에서 {학번}을 기본키로 선택했다면, 남은 후보키인 {주민등록번호}와 {이메일}이 바로 대체키가 됩니다.
대체키는 왜 필요할까요? 비록 대표 선수인 기본키는 아니지만, 이들 역시 시스템 운영에 있어 중요한 역할을 합니다. 예를 들어, 학생이 자신의 학번을 잊어버렸을 때, 이메일 주소나 주민등록번호를 통해 본인 인증을 하고 학번을 찾을 수 있도록 시스템을 구현할 수 있습니다. 이처럼 대체키는 기본키 외에 데이터를 검색하거나 유일성을 보장해야 하는 추가적인 제약 조건이 필요할 때 유용하게 사용됩니다.
데이터베이스 시스템에서는 대체키에 대해 ‘UNIQUE’ 제약 조건을 설정하여 데이터의 중복 입력을 방지하는 용도로 많이 활용합니다. 예를 들어, {이메일} 속성에 UNIQUE 제약 조건을 걸어두면, 시스템에 동일한 이메일 주소가 두 번 등록되는 것을 막을 수 있어 데이터의 정합성을 높일 수 있습니다.
정리하자면, 키들의 관계는 다음과 같습니다.
- 유일성을 만족하는 모든 키의 조합을 찾는다. (슈퍼키)
- 슈퍼키 중에서 최소성을 만족하는 키들을 추려낸다. (후보키)
- 후보키 중에서 가장 대표가 될 만한 키를 하나 선택한다. (기본키)
- 기본키가 되고 남은 후보키들을 대체키로 둔다. (대체키)
외래키 (Foreign Key): 테이블과 테이블을 연결하는 관계의 열쇠
지금까지 다룬 키들이 하나의 테이블 ‘내에서’의 규칙과 질서를 잡는 역할을 했다면, 외래키는 테이블과 테이블 ‘사이’의 관계를 맺어주는 연결고리 역할을 합니다. 외래키는 한 테이블에 속한 속성(열)이 다른 테이블의 기본키를 참조하는 것을 말합니다. 이 관계를 통해 데이터베이스는 데이터의 ‘참조 무결성(Referential Integrity)’을 보장합니다.
참조 무결성이란, 외래키의 값은 반드시 참조하는 테이블의 기본키 값 중 하나이거나, 혹은 NULL이어야 한다는 규칙입니다. 이는 존재하지 않는 대상을 참조하는, 즉 허상 데이터를 방지하는 매우 중요한 제약 조건입니다.
예를 들어, ‘수강신청’이라는 새로운 테이블을 만들어 보겠습니다.
학생 테이블
| 학번 (PK) | 이름 | 전공 |
| 1001 | 김민준 | 컴퓨터공학 |
| 1002 | 이서연 | 경영학 |
| 1003 | 박도윤 | 컴퓨터공학 |
수강신청 테이블
| 수강ID (PK) | 수강생_학번 (FK) | 과목코드 | 성적 |
| 1 | 1001 | CS101 | A+ |
| 2 | 1002 | MG203 | A0 |
| 3 | 1001 | CS305 | B+ |
| 4 | 9999 | CS101 | C0 |
‘수강신청’ 테이블의 수강생_학번은 ‘학생’ 테이블의 학번(기본키)을 참조하는 외래키(FK, Foreign Key)입니다. 이 외래키 관계를 설정하면, 수강생_학번 열에는 반드시 ‘학생’ 테이블의 학번 열에 존재하는 값(1001, 1002, 1003)만 입력될 수 있습니다.
위 예시의 4번째 행처럼, ‘학생’ 테이블에 존재하지 않는 9999 학번 학생의 수강 정보를 입력하려고 하면 데이터베이스 시스템은 참조 무결성 위반 오류를 발생시키며 데이터 입력을 막습니다. 또한, ‘학생’ 테이블에서 학생 1001의 정보를 삭제하려고 할 때, 이 학생의 수강신청 정보가 ‘수강신청’ 테이블에 남아있다면 삭제가 제한될 수 있습니다. 이처럼 외래키는 두 테이블의 데이터가 항상 일관성 있는 상태를 유지하도록 강제하는 안전장치 역할을 합니다.
이러한 외래키 관계를 통해 우리는 여러 테이블에 흩어져 있는 정보를 마치 하나처럼 연결하여 조회하고 관리할 수 있게 되며, 이것이 바로 관계형 데이터베이스의 핵심 원리입니다.
마무리: 데이터 무결성의 초석, 올바른 키의 선택과 활용
지금까지 데이터베이스의 질서를 유지하는 다섯 가지 핵심 키인 슈퍼키, 후보키, 기본키, 대체키, 외래키에 대해 알아보았습니다. 이 키들은 단순히 데이터를 구분하는 표식을 넘어, 데이터의 유일성과 최소성을 보장하고 테이블 간의 논리적 관계를 설정하여 데이터의 무결성과 일관성을 지키는 데이터베이스의 헌법과도 같습니다.
가장 넓은 범위의 슈퍼키에서 시작하여 최소성을 만족하는 후보키를 걸러내고, 그중 가장 적합한 것을 기본키로 선정하며, 나머지를 대체키로 활용하고, 외래키를 통해 관계를 확장해나가는 이 일련의 과정은 논리적이고 체계적인 데이터베이스 설계의 근간을 이룹니다. 따라서 각 키의 특징과 관계를 명확히 이해하고, 설계하려는 시스템의 특성을 깊이 고려하여 최적의 키를 선택하고 적용하는 것은 성공적인 데이터베이스 구축의 가장 중요한 첫걸음이라 할 수 있습니다. 키를 잘못 선택하면 데이터의 신뢰도가 떨어지고 시스템의 성능 저하를 유발할 수 있으므로 항상 신중을 기해야 합니다.
