안녕하세요, 오늘은 관계형 데이터베이스(RDBMS)에서 자주 사용되는 개념 중 하나인 키(Key)와 이의 종류에 대해 이해해보는 시간을 가져보도록 하겠습니다. 특히 딱딱한 설명이 아닌, 친근한 예시를 통해서 키(Key)라는 것이 무엇이고, 기본키, 후보 키, 대체 키 등이 과연 무엇을 의미하는 지 직관적으로 알아보는 시간을 가지겠습니다.
키(Key)의 개념
관계형 데이터베이스(RDBMS)에 다음과 같이, STUDENT라는 테이블 내에 4명의 학생 관련 데이터가 저장이 되어 있다고 가정을 해 보겠습니다.
Student라는 테이블이 존재하고, 각 학생의 정보들이 테이블의 로우(Row, 행)형태로 담겨 있습니다. 그러니까 쉽게 말하면, 테이블의 각 행은 하나의 학생에 대응된다고도 말할 수 있습니다. 여기서, 우리는 학번, 이름, 주민등록번호, 성별, 핸드폰번호 이렇게 총 다섯 개의 컬럼을 가지고 있습니다. 이 다섯 개의 컬럼 중에서, 학생을 유일하게 식별해낼 수 있는 컬럼에는 무엇이 있을까요?
조금 더 쉽게 표현하기 위해서 예를 들어보겠습니다. 4명의 학생이 아니고 조금 더 과장을 해서, 5천 억 명 학생분의 데이터가 저장이 되어 있다고 해 보겠습니다. 이렇게 학생이 아무리 많은 상황이더라도, 1이라는 학번을 가진 학생, 2라는 학번을 가진 학생, 150이라는 학번을 가진 학생은 각각 최대 1명 존재합니다.(어쩌면 존재하지 않을 수도 있습니다.) 이 때 우리는 '학번'이라는 컬럼을 '유일한 식별자'라고 부릅니다.
다섯 컬럼을 순서대로 생각 해 봅시다.
학번 : 학생이 아무리 많이 존재해도, 같은 학번을 가진 경우는 존재하지 않는다.
이름 : 학생의 수가 많다면 동명 이인이 존재할 수도 있다. 즉, 같은 이름을 가진 경우는 존재한다.
주민번호 : 학생이 아무리 많이 존재해도, 같은 주민번호을 가진 경우는 존재하지 않는다.
성별 : 학생들의 성별이 겹치는 경우는 얼마든지 존재할 수 있다.
핸드폰번호 : 학생이 아무리 많이 존재해도, 같은 핸드폰 번호를 가진 경우는 존재하지 않는다.
즉 다섯 개의 필드 중에서, 학생을 유일하게 구분해낼 수 있는 도구가 될 수 있는 필드는 학번, 주민번호, 핸드폰번호 이렇게 세 개 입니다. 우리는 이러한 필드를 키(Key)라고 부릅니다. 지금까지의 논리를 정리하면 다음과 같이 되는 것입니다.
"학생이 아무리 많이 존재하더라도,
학생끼리 학번이 겹치는 경우, 주민등록번호가 겹치는 경우, 핸드폰 번호가 겹치는 경우는 절대로 존재하지 않는다.
따라서 학번, 주민등록번호, 핸드폰 번호는 학생을 유일하게 식별해낼 수 있는 도구가 될 수 있다.
이러한 도구를 키(Key)라고 부른다."
키(Key)의 종류
데이터베이스의 키에는 후보 키, 기본 키, 대체 키 등이 있습니다. 그 이외의 키들도 있지만 설명의 편의를 위하여 나머지 키의 설명은 생략하겠습니다.
후보 키(Candidate Key)
우리는 다음 데이터베이스 테이블을 살펴보았습니다.
그리고 키(Key) 라는 것은 "각 데이터를 유일하게 식별해낼 수 있는 도구"라고 말씀드렸습니다. 이 테이블에서 이 키(Key)의 후보가 될 수 있는 컬럼은 무엇이 있을까요? 방금 말씀드린 대로, 학번, 주민등록번호, 핸드폰번호 이렇게 세 개의 컬럼을 들 수가 있습니다. 이렇게, 데이터베이스의 테이블을 구성하고 있는 컬럼 중에서, 데이터를 유일하게 식별해내는 데 사용이 될 수 있는 컬럼들을 바로 후보 키(Candidate Key)라고 부릅니다.
기본 키(Primary Key)
보통 데이터베이스의 각 테이블을 관리할 때는, 앞서 설명드린 후보 키(Candidate Key)들 중에서 딱 하나의 키를 골라 테이블을 대표하는 유일한 키로 임명합니다. 이렇게 임명된 키를 바로 기본 키(Primary Key)라고 합니다.
대체 키(Alternate Key)
위 예시에서 학번이라는 컬럼을 기본 키(Primary Key)로 정했다고 해 보겠습니다. 그러면 나머지 키인 주민등록번호와 핸드폰번호가 대체 키(Alternate Key)가 됩니다. 테이블을 대표하는 기본 키는 아니지만, 키의 특성을 가지고 있어 얼마든지 대체될 수 있기 때문에 붙여진 이름입니다.
'Database' 카테고리의 다른 글
GraphQL 연관관계 객체 쿼리 시 발생하는 Lazy Loading 문제 (0) | 2024.11.01 |
---|---|
관계형 데이터베이스 참조 무결성 제약 조건과 Cascade 옵션의 동작 원리 (0) | 2024.04.09 |
[Oracle] Oracle Database 관리자 권한을 가지는 User 1분 만에 생성하기 (0) | 2022.03.06 |