본문 바로가기

별걸다하는 IT/데이터베이스 Database

[데이터베이스]릴레이션 키 개념& 종류(기본키, 슈퍼키, 대체키, 복합키, 후보키)&특징, 유일성 최소성이란?

반응형

[데이터베이스]

데이터베이스 완벽 정리 목차

 

오늘은 데이터베이스 릴레이션 키에 대해서 알아볼거예요.

키의 개념은 영어를 하기 위해서는 알파벳을 알아야 하는 것처럼 기본 중의 기본에 해당합니다.

 

키란? Key?

 

 

키(key)는 데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 다른 튜플들과 구별할 수 있는 유일한 기준이 되는 Attribute(속성)입니다.

 

자물쇠에 맞는 키는 하나밖에 없어요. 아무리 많은 자물쇠가 있어도 오로지 그에 맞는 한 키만이 그 자물쇠를 구별해줍니다! 

데이터베이스에서 키는 데이터들을 구별할 수 있는 기준(?)을 말해요!

 

 

 

 

 

기본키 (주 키, Primary Key 프라이머리 키, PK)

 우리나라 정부는 국민들에 대한 데이터를 다 가지고 있어요. 근데 우리나라 사람들은 5000만이 넘는데... 와 사람들을 어떻게 식별할까요? 이름? 나랑 같은 이름을 가진 사람이 존재할 수 있죠. 이름을 검색해도 누가 나인지 알수가 없어요 ㅠ

 

또 나와 같은 년도, 같은 날짜에 태어나 같은 이름을 가진 사람이 아예 없을거라고 보장할 수 는 없어요. 확률이 매우 적긴 하겠지만 정말 낮은 확률로 그런 일이 일어난다면 불법은 아니잖아요? 그러면 나와 똑같은 인간의 데이터가 두 개가 되는거죠!! 심지어 사는 곳도 같다면!!! 아 ~~ ㅎㅎ 

 

이런 경우, 다른 항목과 절대로 중복되어서 나타날 수 없는 단일 값을 정해주는데, 여기서는 주민등록번호(Social Security Number)가 되겠습니다. 그래서 우리는 사람을 식별하기 위해 태어날 때 주민등록번호를 부여해요. 이러면 모든 사람들이 다 다른 값을 갖게 되니까 데이터가 일치해서 같은 사람인가? 할 때도 주민등록번호를 보고 다른 사람이구먼! 이런 우연이 다있네! 할 수 있는거죠.

 

In the world of databases, the primary key of a relational table uniquely identifies each record in the table.

데이터베이스에서, 기본 키는 위 주민등록번호처럼 테이블의 각 레코드(저 테이블에서 행)들을 고유하게 식별해주는 역할을 합니다. 

 

기본키 특징

-- 속성이 항상 고유한 값을 가져야 합니다.

-- 속성이 확실히 널 값을 가지고 있지 않아야 합니다.

-- 속성의 값이 변경될 가능성이 높은 속성은 기본 키로 선정하지 않는게 좋습니다.

-- 가능하면 작은 정수 값이나 짧은 문자열을 갖는 속성을 기본키로 선정하는게 좋아요 (그 많은 데이터 중 빠르게 검색하기 위해서 그래요)

-- 가능하면 복합 기본 키는 피할 것 (복합키가 무엇인지에 대해서는 밑에 쭉 읽어보면~~!)

-- 테이블에 기본키는 하나만 만들 수 있습니다.

-- 기본키가 없는 테이블을 만든다고 규칙에 어긋나는 것은 아니지만 모든 테이블에 기본키를 두도록 합시다.

테이블에 기본키가 없으면 반복적이고 일관성 없는 데이터들이 쌓여 뭔가 내가 원하는 데이터를 추출하기 위해 명령을 내리면 이를 수행하는 속도가 느릴 수 있고(=쿼리 수행 속도가 느리다) 다양한 문제를 일으킬 수도 있다.

후보키(candidate key)와 대체키(Alternate key)

그런데 이렇게 생각하는 사람들이 있을 수 있어요. 사람을 구별하는데 주민등록번호 말고, 핸드폰 번호로도 구별할 수 있지 않나요? 어차피 핸드폰 번호의 경우 다른 사람이 같은 번호를 가지고 있을 수는 없잖아요?

 

자 이렇게 읭? 테이블의 튜플들을 구별하기 위한 기본키로 다른 애도 되는데?

네 될 수 있습니다! 이렇게 기본키가 될 수 있는 후보들을 후보키라고 합니다. 말 그대로 후보들이예요.ㅎㅎ

기본키는 이 후보들 중에 하나가 채택된거겠죠?

 

후보키(candidate key)란 테이블에서 각 튜플들을 구별하는 데 기준이 되는 하나 혹은 그 이상의 칼럼들의 집합입니다.

(후보키는 테이블에 있는 각 튜플을 고유하게 식별할 수 있어야 해요.)

 

근데 사람이 휴대전화를 안가지고 있을 수도 있으니 사실 휴대번호는 후보키에 적합하지 않을 수 있죠 ㅎㅎ

(그래서 기본키는 무조건 값이 존재해야 합니다 즉 NULL 값이 없어야 해요)

 

자 또 다른 예시를 들어볼게요 

신용카드 회사의 고객 릴레이션에서 신용카드번호와 주민등록번호가 후보키가 될 수 있어요. (둘 다 고객을 고유하게 식별할 수 있으니까요!) 고객이 신용카드 가맹점에서 상품을 구입하고 신용카드로 대금을 지불할 때 카드의 분실 여부, 한도액 등을 실시간에 확인하려면 신용카드번호를 사용해 고객 튜플에 접근해야 합니다. 하지만 고객이 카드를 분실했을 때 신용카드 회사에 신용카드 분실 신고를 해야 하는데 16자리의 신용카드번호를 기억하지 못하거나 메모해 두지 않았으면 자신의 주민등록번호를 알려서 신용카드 사용을 중지시켜야 해요. 신용카드 회사에서는 분실 신고 빈도보다 정상적인 카드 결재 빈도가 훨씬 높으므로 신용카드 회사의 고객 릴레이션에서 신용카드 번호를 기본 키로 선정하는 것이 좋습니다.

신용카드번호와 주민등록번호를 후보키라고 하며, 우리가 선택한 신용카드 번호는 기본키가 됩니다. 그러면 후보키에서 기본키로 사용될 잠재적 역량을 가졌지만 선택되지 못한 주민등록번호같은 경우는 여기서 대체키라고 부릅니다. 비록 선택되지 못했지만 자격이 있어 언제든지 대체될 수 있으니까요!

 

DBMS는 새로운 튜플이 릴레이션에 삽입될 때 새로운 튜플의 후보키 값이 기존의 튜플들의 후보키 값과 동일한지 여부를 비교하여 중복 여부를 확인하게 됩니다. 

 

Typically, one candidate key is chosen as the primary key. 

하나의 후보키가 기본 키로 선택되면 다른 후보키들은 대체키가 됩니다. 

 

 

복합키(Composite Key)란? 

신용카드 회사 예시에 이어서 또 다른 예시를 하나 생각해볼까요?

 

Example) 대학교에 어떤 학생이 어떤 과목을 수강하는지 저장하는 데이터베이스가 있어요~

  학번  과목번호   학점 
 11002   CS310   A0 
 11002   CS313   B+ 
 24036   CS345   B0 
 24036  CS310   B- 

[↑ 수강 릴레이션]

수강 릴레이션에서 각 학생은 여러 과목을 수강할 수 있고 각 과목마다 여러 학생이 수강할 수 있습니다. 따라서 학번이나 과목번호가 사용해서는 각 튜플을 고유하게 식별할 수 없어요. 학번을 기본키로 하면 두 개 튜플이 중복되 유일성을 만족시키지 않고(1번과 2번 튜플), 과목번호를 기본키로 하면 11002학번의 학생도 CS310과목을 들을 수 있고 24036학번의 학생도 CS310과목을 들을 수 있으니까 마찬가지로 중복되죠. 따라서 단일 속성으로는 튜플을 구분할 수 없고 두 개의 속성이 모인 (학번, 과목번호)가 후보 키가 됩니다.

 

In database design, a composite key is a candidate key that consists of two or more attributes (table columns) that uniquely identify an entire occurrence (table row).

데이터베이스 설계에서 복합키는 각 튜플들을 식별할 수 있는 두개 또는 그 이상의 속성들로 구성된 후보키를 말해요.

 

후보키도 복합키일 수도 있고!!

대체키도 복합키일 수도 있고!!

기본키도 복합키일 수도 있고!! (근데 가능하면 피하는게 좋아요. 나중에 더 자세히 알아볼거예요)

 

튜플을 구별하는 속성이 하나면 단일키인거고 두 개 이상으로 이루어졌으면 복합키인 거고 간단하죠? :)

 

 

슈퍼키 (Super key, 수퍼키)

후보키, 기본키, 대체키 다 봤고 이제 오늘 배울 것 중 슈퍼키 하나가 남았네요.

수퍼키도 키이므로 투플들을 고유하게 식별하는 기능을 합니다. 앞으로 배울 키와 지금까지 배운 키들의 관계를 먼저 살펴볼게요

수퍼키가 가장 넓은 범위를 가지고 있어요 우리가 배웠던 거 모두를 아우르고 있네요 ㅎㅎ

수퍼키는 정말 투플을 키 기능만 하면 일단 됩니다. 특정 튜플을 고유하게 식별할 수만 있으면 돼요. 

 

아까 예시로 들었던 신용카드 회사 고객 릴레이션에서 

(신용카드번호)도 튜플을 구별하지만 사실, (신용카드번호, 주소) 이렇게 두 개의 속성으로도 튜플을 구분할 수 있잖아요

어차피 신용카드번호에서 각각 다 구별이 되니 신용카드에 뭘 더해 복합키를 만들던 결국 각 데이터들을 구분해주겠죠.

 

즉 (주민등록번호, 이름), (주민등록번호, 주소), (주민등록번호, 이름, 주소) 등등 이거 다 튜플을 구분해주므로 슈퍼키가 되는겁니다. 그래서 슈퍼키랑 후보키의 가장 큰 차이는 최소성입니다.

(주민등록번호, 이름)도 물론 튜플을 구분해주지만 이름 속성 없이 주민등록번호 속성부터가 애초에 튜플을 구분해주므로 (주민등록번호)가 최소성을 만족시키고 (주민등록번호,이름)은 최소성을 만족시키지 못하는 것이 되는 거예요! 

슈퍼키 -- 릴레이션을 구성하는 모든 튜플에 대해 유일성은 만족하지만, 최소성은 만족하지 못합니다.

 

유일성: 하나의 키 값으로 하나의 튜플을 유일하게 식별할 수 있어야 하는 것

최소성: 키를 구성하는 속성 하나를 제거하면 유일하게 식별할 수 없도록 꼭 필요한 최소의 속성으로 구성되어야 한다는 것.

 

이번 포스팅은 여기까지

다음번에는 나머지 키, 외래키, 인조키, 대리키에 대해서 알아볼게요.

 

도움됐다면 공감!

 

반응형