DB/SQL - Oracle

[SQL] 데이터베이스 제약조건 "키" - 기본키, 외래키, 슈퍼키, 후보키, 대체키

생각많은 프로그래머 2024. 2. 1. 02:47
키에 대해 이해하려면 먼저 유일성과 최소성이라는 단어를 이해해야 한다.

 

유일성 중복값 없이 단 하나만 존재한다는 의미이다.
하나의 키값만으로도 하나의 튜플을 식별할 수 있어야 한다.
 
예를 들어 아이디 aaa를 찾아보라고 했을 때 딱 하나의 튜플이 나오면 유일성을 만족하고, 
​이름이 홍길동인 사람을 찾아보라고 했을 때 여러 튜플이 해당되면 유일성을 만족하지 못한다.
하지만 아이디와 이름을 조합하여 슈퍼키로 만들면 유일성에 해당된다. 
아이디가 유일성을 이미 만족하기 때문이다.
최소성은 키의 조합에서 유일성을 만족하기 위해 불필요한 속성이 없어야 한다는 것을 말한다.
키를 조합할 경우 유일성을 만족하지 않은 속성을 포함하고 있다면 최소성에 부합하지 않는다.

 

예를 들어 회원가입을 할 때 해당 회원의 아이디가 중복되지 않는 유일한 값이고,
회원가입 시 식별을 위해 회원고유번호가 함께 데이터 베이스에 저장된다고 하면
데이터베이스 상에서는 회원의 아이디나 회원고유번호 하나만 알고 있어도
해당 회원의 튜플을 식별할 수 있다. 만약 키의 조합으로 회원의 아이디와 회원고유번호를 함께
묶는다면 이미 각각 유일성을 만족하는 속성이므로, 두 가지 속성을 조합해도
최소성과 유일성을 모두 만족한다.
 
반면, 이름은 중복될 수 있기 때문에 만약 키의 조합을 아이디와 이름으로 했다면
최소성에는 부합하지 않는다.
아이디라는 속성이 이미 유일성을 만족하므로 다른 속성과 함께 조합되어 키로 
사용되어도 언제나 유일성은 만족하지만, 이름은 유일성을 만족하지 않으므로 
굳이 키의 조합에 넣지 않아도 되는 불필요한 속성에 해당한다.
결과적으로 아이디와 이름의 조합으로 키를 만들었다면 최소성에는 부합하지 않는다.

 

키라는 것은 속성의 조합으로 테이블에서 특별한 의미를 가진 속성이다.

(반에서 반장 부반장 같은 느낌으로)
- 키
키는 어떤 속성에 의미를 부여한 것을 말한다.
키는 무언가를 식별하는 고유한 식별자(identifier) 기능을 한다. 데이터베이스에서 조건에
만족하는 관계의 행을 찾거나 순서대로 정렬할 때 다른 행과 구별할 수 있는 유리한 기준이 되는
속성의 집합이다. 키는 제약조건과 완전히 같은 의미는 아니다.
- 슈퍼키
테이블에서 각 행을 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합을 말한다.
슈퍼키는 유일성만 만족하면 될 수 있다.
유일성이란 하나의 키로 특정 행을 바로 찾아낼 수 있는 고유한 데이터 속성을 말한다.
예를 들면 아이디나 주민번호가 이에 해당한다.
- 후보키
테이블에서 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합.
후보키는 기본키가 될 수 있는 후보들이며 유일성과 최소성을 동시에 만족해야 한다. 
(기본키는 후보키 중에 골라야 함)
- 기본키
후보키들 중에서 하나를 선택한 키로 최소성과 유일성을 만족하는 속성을 가진다.
테이블에서 기본키는 오직 1개만 지정할 수 있다. 
기본키는 테이블 안에서 유일하게 각 행들을 구별할 수 있도록 쓰인다.
index가 자동생성되기 때문에 ​튜플을 유일하게 식별할 수 있다.
기본키는 NULL 값을 절대 가질 수 없고 중복된 값을 가질 수 없다. 
각 행들을 구별하려면 값이 없어선 안되고, 중복되어서도 안되기 때문이다.

 

 

- 외래키
외래키는 다른 테이블의 기본키를 참조하는 칼럼(속성) 또는 이러한 속성들의 집합이다.
자식 릴레이션의 속성이 부모 릴레이션의 속성을 참조한다.
여기서의 외래키값은 참조하고 있는 릴레이션의 기본키에 없는 내용을 참조할 수 없으며,
null값을 가질 수 있다. 이를 참조 무결성이라고 한다.
외래키는 속성 간의 연관성을 가지며 다른 릴레이션과의 관계를 표현할 때 사용한다.
다른 테이블의 데이터를 참조할 때 없는 값을 참조할 수 없도록 제약을 주는 키이다.
이때 참조될 부모 릴레이션을 먼저 생성한 뒤 데이터를 넣고 이후 자식 릴레이션을 만든 후
부모 릴레이션에서 참조될 열의 값을 기본키로 설정한다.
즉, 부모 릴레이션에 있는 특정 열을 자식 릴레이션에서 참조한다.
 
- 대체키 
 
후보키가 두 개 이상일 경우, 그 중에서 어느 하나를 기본키로 지정하고 남은 후보키를 대체키라 한다.
 
 
 
 
+
데이터베이스도 저장관점에서 본다면 어려운 게 없지만,
어떻게 하면 자료를 빨리 가져올 수 있는 지가 고민할 지점이다.
장농으로 보면 파티션으로 분리가 잘 되어있는 것이 편리한 것처럼
원하는 데이터를 빠르게 찾아내려면 파티션과 같이 어떤 장치가 필요할 것이다.

 

데이터베이스에는 엄청나게 많은 데이터가 저장되기 때문에​ 
데이터베이스 업무에서의 가장 큰 관심사는 바로 '속도'이다. (저장속도, 검색속도 등등)

 

데이터베이스에서도 자료를 저장할 때 index를 사용하면 찾기가 수월해진다.
이 맥락에서 여러 방법이 있겠지만, 데이터를 저장하고 검색하는데
이점을 가져오기 위해서 primary key(기본키)를 사용한다.

 

primary key(기본키)는
​unique + not null + 자동으로 index 형성 하는 기능을 가진다. 
​예를 들면, id varchar2(3) primary key, 와 같이 작성한다.
 

 

기본키는 행의 식별자이다!
기본키 기능은 필수는 아니지만 만드는 게 좋다. 
테이블 하나에 여러 개의 인덱스를 지정하면 속도가 오히려 느려지므로 
​하나의 테이블 당 1개의 인덱스를 지정하는 것이 좋다.
 
인덱스로 지정한 컬럼에 대해 검색하는데 속도가 훨씬 빨라지지만
그 외의 컬럼에 대한 검색을 할 때는 다른 (인덱스가 안걸린) 테이블과 속도가 유사할 것이다.
***인덱스는 속성에 지정하는 것이다! 테이블이 아니고!