키(Key)
릴레이션에서 다른 튜플들과 구별할 수 있는 유일한 기준이 되는 속성(attribute), a.k.a. 식별자

속성에 밑줄을 그어 키(기본키) 임을 표시
키의 특성
- 유일성: 하나의 키 값으로 하나의 튜플을 유일하게 식별할 수 있어야 함
- 최소성: 키를 구성하는 속성 중 하나를 제거하면 유일하게 식별할 수 없도록 꼭 필요한 최소의 속성으로 구성되어야 함
키의 종류
후보키(Candidate key)
- 튜플을 유일하게 구분할 수 있는 최소한의 속성의 집합
- 유일성, 최소성을 만족해야 함
기본키(Primary key)
- 후보키 중 선정되어 엔티티를 대표하는 키
- 따라서, 유일성, 최소성을 만족
- NULL 값을 가질 수 없음 ❗️개체 무결성❗️
여러 후보키 중 어떤 걸 기본키로 설정해야 할까?
ㅤ
NULL 값을 가질 수 있는 속성이 포함된 후보키는 부적합
👉 다른 튜플과 구분하기 어려움
값이 자주 변경될 수 있는 속성이 포함된 후보키는 부적합
👉 다른 튜플과 구별되는 값인지 매번 확인해야 하는 번거로움
단순한 후보키를 기본키로!
👉 정수, 단순 문자열 👉처리 및 이해가 쉬움
고유키(Unique key)
- 값이 입력되지 않아도 됨(NULL 허용)
- 고유키 + NOT NULL = 기본키 (속성만 봤을 때)
대체키(Alternate key)
슈퍼키(Super key)
외래키(Foreign key)
외래키는 왜 필요할까?
ㅤ
고객정보와 주문정보가 있다고 하자. 주문정보가 갱신될 때마다 매번 고객정보도 같이 저장할 수 없다. 저장하게 되면 데이터 중복이 발생하고, 결국 많은 메모리가 필요하고 검색에 많은 시간이 들 수 있다.
따라서, 고객정보와 주문정보를 다른 테이블에 저장하고 주문정보 테이블에 고객정보를 찾을 수 있는 정보(고객정보 테이블의 기본키)를 추가해 관리한다! 이를 외래키라고 한다
- 다른 릴레이션의 기본키를 참조하는 속성 또는 속성의 집합
- 릴레이션 간의 관계를 나타내기 위해 사용됨
- 외래키는 참조 릴레이션의 기본키와 동일한 키 속성(도메인)을 가짐
- 따라서, 하나의 필드 또는 전체 필드의 부분집합이 될 수 있음
- 중복된 값과 NULL 값을 가질 수 있음
- if not null 👉 다른 테이블의 존재하는 기본값을 참조해야 함 ❗️참조 무결성❗️
- null은 존재하는 값이 아니지만 다수의 데이터베이스에서 예외로 둠 (ex. 사원은 하나의 부서를 갖는다. 하지만 신입사원은 부서가 미정일 수 있다.)
