기본키
기본키는 DB에서 Primary Key라고 부른다.
선정하는 이유
예시로 짱구라는 이름을 찾으려고 할때 동명이인이 무수히 많다면 찾는데 오랜 시간이 걸린다.
하지만 학번이나 주민번호로 찾게되면 쉽게 찾을 수 있는데 이런 학번이나 주민번호는 중복되면 안되고 쉽게 찾을 수 있도록 하기 위해 기본키로 선정한다.
기본키의특징
- Null값을 가질 수 없다.
- 테이블에 저장된 행을 식별할 수 있는 유일한 값이어야 한다.
- 값의 중복이 없어야 한다.
후보키
후보키란 테이블을 구성하다보면 기본키에 해당되는 컬럼들을 많이 만들 수 있는데 주민번호나 전화번호, ID가 이러한 것들이고 이런 주민번호나 전화번호, ID는 모두 기본키가 될 수 있다 즉, 후보키는 유일성과 최소성을 만족해야 한다.
여기서 모두 기본키가 될 수 있는 컬럼들을 후보키라고 한다.
그럼 보조키랑(대체키)는 무엇인가?
주민번호나, 전화번호, ID 중 하나를 기본키로 정한다면 나머지는 보조키(대체키)가 되는 것이다.
쉽게 말해 후보키가 2개 이상이면 기본키를 제외하고 남은 키들을 말한다.
선정하는 이유-예시
만약 기본키에 해당하는 정보들이 어떠한 사정 또는, 이유 때문에 중복이 되어야 한다면 우리는 기본키를 다시 정해야한다. 그렇기 때문에 이렇게 나눠놓는 것이다.
외래키
외래키는 예시를 통해 바로 알아보도록 하겠다.
학교명 |
학번 |
이름 |
학과 |
주소 |
대표 전화번호 |
정보대학교 |
20230301 |
아무개 |
경영학과 |
서울 마포 |
02-0001 |
정보대학교 |
20230302 |
홍길동 |
세무학과 |
경기도 안산 |
02-0004 |
정보대학교 |
20230303 |
김이등 |
경영학과 |
경기도 수원 |
02-0001 |
정보대학교 |
20230304 |
최일등 |
세무학과 |
인천 |
02-0004 |
·
·
·
위 테이블처럼 학교명, 학번, 이름, 학과, 주소, 대표 전화번호가 있고 학교명과 학과, 대표변호가 중복되고 학생들 수가 대략 3만명이 된다.
여기서 '경영학과'의 대표번호를 '02-0001' 에서 '02-0002'로 바꾸었고 '세무학과'가 이름을 개편해 '세무·회계학과'로 바뀌었다고 가정한다면 수 많은 학생들의 데이터를 일일히 다 수정하기에는 너무 비효율 적이다.
이럴때를 대비해 외래키가 존재합니다.
학번 |
이름 |
주소 |
학과코드 |
20230301 |
아무개 |
서울 마포 |
MAN |
20230302 |
홍길동 |
경기도 안산 |
TAX |
20230303 |
김이등 |
경기도 수원 |
MAN |
20230304 |
최일등 |
인천 |
TAX |
학과코드 |
학과 |
대표 전화번호 |
학교명 |
MAN |
경영학과 |
02-0002 |
정보대학교 |
TAX |
세무·회계학과 |
02-0004 |
정보대학교 |
MAN |
경영학과 |
02-0002 |
정보대학교 |
TAX |
세무·회계학과 |
02-0004 |
정보대학교 |
이렇게 공통되는 요소(학과, 대표 전화번호, 학교명)들을 분리해서 학과 코드라는 것으로 묶어버릴 수 있고 서로 다른 2개의 테이블에 같은 컬럼이 존재하게 된다. 또한, 아무리 많은 데이터라도 학과나 대표 전화번호가 변경 될 경우 학과코드가 있는 테이블에 들어가서 수정만 해주면 된다.
이렇게 학과코드는 두 테이블을 서로 연결하는데 사용되는 외래키가 된다.
외래키 사용 시 주의사항
- 외래키 값은 Null이거나 부모 테이블의 기본키 값과 동일해야한다.
- 부모 테이블의 기본키, 고유키를 외래키로 지정할 수 있다.
- 부모 테이블의 기본키, 고유키가 여러개의 컬럼으로 이루어져 있다면 부모가 가진 기본키, 고유키 컬럼을 원하는 개수만큼 묶어서 외래키로 지정할 수 있다.
복합키
복합키는 기본키가 되지 못하는 컬럼들을 서로 묶어서 기본키처럼 사용하는 것으로 복합키는 2개 이상의 컬럼을 묶어서 만들 수 있다.
예를 들어 테이블을 만들고 데이터를 넣었는데 기본키가 없다면 10만개의 데이터를 어떻게 빠르고 쉽게 찾을 수 있을까?
거의 인덱스를 사용하면 가능하지만 그게 아니라면 불가능에 가까운데 이때 복합키를 사용한다.
좀더 예를 들자면 이름과 사는 곳을 묶어서 복합키로 만들었는데 중복데이터가 발생한다면 성별로 묶고 또 중복 데이터가 발생한다면 생일로 묶는 식으로 기본키의 조건에 만족할때까지 컬럼들을 묶어주면서 복합키를 완성시키면 되는데 복잡하기에 기본키를 만드는게 중요하며 복합키 또한, 최대한 컬럼을 적게 묶는것이 중요하다.