Relation
주로 테이블(Table)과 같은 의미로 사용되며, 데이터의 집합을 의미한다. 튜플(Tuple)과 어트리뷰트(Attribute)로 구성되어있다.
Table 중 데이터베이스에서 사용되기 위한 조건을 갖춘 것이 relation이다. Relation의 제약 조건 중 가장 자주 등장하는 조건은 다음과 같다.
- table의 cell은 단일 값을 갖는다.
- 어떤 두 개의 row도 동일하지 않다.
키가 존재하는 이유
튜플을 구별하기 위해
튜플을 유일하게 구별하기 위해 모든 속성을 이용하는 것보다 일부 속성만 이용하는 것이 효율성을 높일 수 있다. 릴레이션에 포함된 튜플들을 유일하게 구별해주는 역할은 속성 또는 속성들의 집합인 키가 담당한다.
※ 튜플 (Tuple) : 릴레이션 (테이블) 을 구성하는 각각의 행, 속성의 모임으로 구성된다. 파일 구조에서는 레코드와 같은 개념.
튜플의 수 = 카디널리티
최소성, 유일성
각각의 키에 대해 공부하기 전에, 최소성과 유일성이라는 개념에 대해 정리해보자.
유일성
유일성이란, 하나의 키값으로 튜플을 유일하게 식별할 수 있는 성질을 말한다. 여러 개의 튜플이 존재할 때 각각의 튜플을 서로 구분할 수 있는 속성이 존재해야 한다. 한 마디로 말하자면, 각각의 튜플은 유일해야 한다는 뜻이다.
예를 들어 어떤 릴레이션에 (주민번호, 나이, 사는 곳, 혈액형) 이라는 속성이 존재한다고 하자. 이 때 나이, 사는 곳, 혈액형 은 모두 충분히 중복될 수 있는 속성들이다. 하지만 주민번호는 모두 다르기 때문에 주민번호 속성에서 중복은 절대 발생할 수 없다. 이 릴레이션에서 키는 주민번호로 지정될 것이며, 이렇게 각각의 튜플을 구분할 수 있는 성질을 유일성이라고 표현한다.
최소성
최소성이란, 키를 구성하는 속성들 중 가장 최소로 필요한 속성들로만 키를 구성하는 성질을 말한다. 쉽게 말해, 키를 구성하고 있는 속성들이 각 튜플을 구분하는 데 꼭 필요한 속성들로만 구성되어 있는지를 의미한다.
예를 들어 (주민번호, 나이, 사는 곳, 혈액형) 릴레이션에서 (주민번호, 나이) 가 키로 지정이 되어 있다면, 당연히 이 키는 각 튜플을 구분할 수 있다. 주민번호와 나이가 모두 같은 사람은 세상에 존재하지 않기 때문에 그렇게 말할 수 있지만, 더 간단하게 주민번호가 중복되는 사람은 세상에 존재하지 않는다. 그렇기 때문에 (주민번호, 나이) 로 지정된 키는 최소성을 만족하지 않고 키에서 나이를 뺀 주민번호 만 키로 지정이 될 경우, 이 키는 최소성을 만족한다고 할 수 있다.
Key의 종류
- 슈퍼 키(Super Key): 각 row를 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합이다. 슈퍼키는 유일성만 만족하면 슈퍼키가 될 수 있다
- 유일성 : 하나의 key 값으로 특정 row만을 유일하게 찾아낼 수 있어야 한다.
- 예시
- (학번)
- (학번,이름)
- (학번, 이름, 학과)
- (주민등록번호)
- (주민등록번호, 학과, 성별)
- 후보 키(Candidate key): Super key 중에서 더이상 쪼개질 수 없는 Super key를 Candidate Key라고 한다. 즉 각 row를이 유일성과 최소성을 만족하는 최소한의 속성들의 집합이다. 기본키가 될 수 있는 후보이기 때문에 후보키라고 불린다.
- 최소성 : 모든 row를 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어야 한다.
- 예시
- (학번)
- (주민등록번호)
- 기본 키(Primary key): 후보 키 중에서 선택된 Main key. 각 row를 구분하는 유일한 열을 말한다. NULL값이 들어갈 수 없으며, 기본키로 선택된 속성(Attribute)은 중복된 값이 들어갈 수가 없다. Table당 1개만 지정해야한다.
- 복합 키(Composite Key): Composite key란 table에서 각 row를 식별할 수 있는 두 개 이상의 속성(attribute)으로 구성된 key를 말한다.
- 대체 키(Surrogate key): 후보 키 중에 기본 키로 선택되지 않은 키.
- 외래 키(Foreign Key): 어떤 테이블(Relation) 간의 기본 키(Primary key)를 참조하는 속성이다. 테이블(Relation)들 간의 관계를 나타내기 위해서 사용된다.
슈퍼키(Super Key) : 유일성 O, 최소성 X
- 7조라는 팀에 팀원은 4명이 있다. 이 4명을 구분할 수 있는 것은 절대 겹치지 않는 학번 일수도 있고, 주민번호일 수도 있다.
- 이름과 나이를 묶어서 하나의 속성으로 만드는 것도 가능하다. 이름과 나이를 합쳐서 7조안에서 중복만 되지 않으면 가능하기 때문이다. 이름과 나이를 합쳐서 4명을 구분할 수 있으면 슈퍼키가 될 수 있다.
- 학번과 주민번호를 묶어서 슈퍼키로 만들수도 있고, (학번 + 주민번호 + 이름)을 합쳐서 슈퍼키로도 만들수 있고, (학번 + 주민번호 + 이름 + 나이)를 합쳐서 슈퍼키를 만들수도 있다. 어떤 속성끼리 묶던 중복값이 안나오고 서로 구별만 할 수 있으면 된다.
후보키(Candidate Key) : 유일성 O, 최소성 O
- 위에서 말했듯이, 이 4명을 구분하는 Super Key들이 모여 있는데, Super Key들 중에서 속성은 최소한의 갯수로 4명을 구분할 수 있어야 후보키(Candidate Key)가 될 수 있다.
- 학번 과 주민번호 Super Key는 속성들이 각 1개씩 이루어져 있다. 하지만 이름+나이 Super Key는 이름과 나이를 묶어서 2개의 속성으로 되어 있다. 이름+나이 Super Key는 속성이 2개 이므로 각각 속성이 1개인 주민번호와 학번 Super Key가 최소성을 만족한다고 할 수 있다.
- 따라서 이름+나이 Super Key는 갯수가 다른 것보다 많기 때문에 최소성을 만족하지 못해서 후보키가 될 수 없다.
기본키(Primary Key) : 후보키 중 선택받은 키
- 후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성이다.
- 테이블에서 기본키는 오직 1개만 지정할 수 있다.
- 기본키는 NULL 값을 절대 가질수 없고, 중복된 값을 가질 수 없다.
대체키(Alternate Key) : 후보키 중 선택받지 못한 키
- 후보키가 두개 이상일 경우 그 중에서 어느 하나를 기본키로 지정하고 남은 후보키들을 대체키라한다.
- 후보키로 학번과 주민번호가 뽑혔고, 둘 중에서 기본키는 학번이 되었다. 학번이 기본키가 되고 남은 후보키인 주민번호는 대체키가 될 수 있다. 학번 기본키가 없어지게 되면 주민번호는 없어진 기본키를 대체할 수 있다.
외래키(Foreign Key) : 다른 릴레이션의 기본키를 참조
- 참조 될 테이블(A)이 먼저 만들어지고 참조하는 테이블(B)에 값이 입력되어야 한다. 즉, 참조되는 부모 테이블이 먼저 생성된 뒤 데이터를 넣고, 참조하는 자식 테이블이 다음에 생겨야한다.
- 이때, 참조될(A) 열의 값은 참조될(A) 테이블에서 기본키(Primary Key)로 설정되어 있어야한다.
- 외래키는 참조되는 테이블의 기본키와 동일한 키 속성을 가진다.
- 부모 테이블 먼저 삭제될 수 없다. 왜냐하면 부모테이블을 참조하는데 부모테이블이 삭제되면 자식테이블은 참조하는 것이 없어지기 때문에 외래키 오류가 생긴다. 따라서 외래키 관계에서 부모테이블을 삭제하려면 자식테이블 먼저 삭제한 후 부모테이블을 삭제해야한다.
아래 사진을 보면 다음과 같다. 부모 테이블은 학생 테이블이고, 자식 테이블은 수강 테이블이다.
학생테이블은 학번이 기본키이자 참조되는 참조키이다.
수강테이블은 학번이 참조하는 키이자 외래키이다.
참고
- https://ggop-n.tistory.com/78
- https://ddecode.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4DB-4%EA%B4%80%EA%B3%84%ED%98%95-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%9D%98-%ED%82%A4key%EC%9D%98-%EC%A2%85%EB%A5%98
- https://inpa.tistory.com/entry/DB-%F0%9F%93%9A-%ED%82%A4KEY-%EC%A2%85%EB%A5%98-%F0%9F%95%B5%EF%B8%8F-%EC%A0%95%EB%A6%AC