본문 바로가기
프로그래밍/DB

DB] 테이블이란? 기본키, 외래키, 후보키, 복합키란

by Hwan2 2020. 11. 7.
728x90
반응형

1. DB에서 테이블이란?

관계형 데이터베이스에서 데이터들을 목록별로 정리해서 완성된 하나의 집합체를 테이블이라고 합니다.


말보단 그림이 더 편할테니 그림을 보시죠.


학번 

이름 

전공 

성별 

집주소 

학년 

20200001

홍길동

소프트웨어과 

남 

경기도 화성 

20200002

아무개 

정보통신과

여 

경기도 수원 

20200003

이몽룡 

소프트웨어과 

남 

서울 마포 

20200004

아름이 

관광과 

여 

인천 

위 표처럼 학번, 이름, 전공, 성별, 집주소 등으로 목록을 정한 후,

해당 목록에 맞게 데이터를 입력해서 완성된 하나의 집합체를 테이블이라고 합니다.


즉, 위 표 전체를 테이블 이라고 말합니다.


저 테이블에서 행과 열로 나눌 수 있습니다.


2. 행과 열

행은 가로를 뜻합니다. DB에서는 로우(row)라고 많이 부릅니다. 


열은 세로를 뜻합니다. DB에서는 컬럼(column)이라고 많이 부릅니다.


여기서 컬럼에 들어갈 데이터들, 즉 


학번이면 20200001, 20200002 등...

이름이면 홍길동, 아무개, 이몽룡 등...

전공이면 소프트웨어과, 관광과 등...


컬럼에 들어가는 데이터들을 어떤식으로 정의할지에 대해 고민하고, 규칙을 정하는 것이 


라는 키워드입니다.


무슨말이냐?? 

학번은 숫자로 할지... 아니면 문자로 할지 정할 수 있고.

또 학번에 중복흘 허용할 것인지, 안할것인지 등...

이러한 것들을 정의하는 것이 데이터 타입과 키 입니다.


3. 기본키

기본키는 DB에서 Primary Key라고 부릅니다. 
이걸 정하는 이유는?? 데이터를 보다 명확하게 구분하고 찾기 위해서죠.

예를들어 위 표에서 이름이 홍길동을 찾는다 하겠습니다.
데이터가 10만개라면? 또한 홍길동이란 이름이 하나가 아니라면? 즉, 동명이인이 있다면?
찾는데 엄청난 시간이 걸릴 것입니다.

하지만 학번같은 경우 개개인마다 부여되는 번호로써 중복되면 안되죠.
때문에 홍길동을 찾기위해서 학번만 안다면 쉽게 찾을 수 있습니다.

이러한 이유때문에 기본키를 정하는 것인데, 기본키는 다음과 같은 조건이 붙습니다.

1. 테이블에 저장된 행을 식별할 수 있는 유일한 값이어야 한다.
2. 값의 중복이 없어야 한다.
3. NULL 값을 가질 수 없다.

여기서 "테이블에 저장된 행을 식별할 수 있는 유일한 값이어야 한다." 라는 부분이 이해가 잘 되지 않을 것입니다.

해당 부분은 관계형 데이터베이스에서 외래키를 사용하기 위해 다른 테이블에 같은 컬럼을 넣을 경우가 있는데,

이 부분은 외래키에서 설명하겠습니다.

4.  후보키, 대체키/보조키

후보키란? 테이블을 구성하다 보면 기본키에 해당되는 컬럼들을 많이 만들 수 있습니다.
위 예시에서 보면 학번 밖에 없네요??....

저희가 일상생활에서 중복이 되면 안되는 것을 생각해 봅시다.


게임 ID, 주민등록번호, 전화번호 등....

이러한 정보들이 하나의 테이블에 모두 들어있다고 가정해 봅시다.


그럼 게임ID, 주민등록번호, 전화번호가 모두 기본키가 될 수 있습니다.

여기서 모두 기본키가 될 수 있는 컬럼들을 후보키 라고 합니다.


이 후보키중 하나를 기본키로 정한다면, 예를들어 게임 ID를 기본키로 정한다면.

나머지 주민등록번호, 전화번호는 보조키(대체키)가 되는 것입니다.


왜 이렇게 귀찮게 분리하고 정의하느냐?

만약 기본키에 해당하는 정보들이 어떠한 사정 또는 이유 때문에 중복이 되어야 한다면??

그럼 우리는 기본키를 다시 정해줘야합니다. 때문에 이렇게 나눠놓은 것입니다.


5. 외래키

기본키의 조건중 "테이블에 저장된 행을 식별할 수 있는 유일한 값이어야 한다." 라는 부분의 의문점을 해결해 줄 외래키입니다.

데이터들을 정의해 테이블에 넣다보면 중복되는 부분이 생기기 마련입니다.


학번 

이름 

전공 

성별 

집주소 

학년 

대표 전화번호

20200001

홍길동

소프트웨어과 

남 

경기도 화성 

02-0001

20200002

아무개 

정보통신과

여 

경기도 수원 

02-0002

20200003

이몽룡 

소프트웨어과 

남 

서울 마포 

02-0001

20200004

아름이 

관광과 

여 

인천 

02-0003


이런 테이블이 있다고 가정해봅시다. 여기서 중복되는 것은 전공과 대표 전화번호 입니다.


이러한 정보들이 10만개 있다고 가정해 봅시다.

근대 소프트웨어과 대표 전화번호가 '02-0001' 에서 '02-0006'으로 바뀌었다고 해봅시다.

또한 '관광과'가 이름을 개편해 '비즈니스 관광과'라고 바꿨다고 가정해 봅시다.


10만개의 데이터들을 일일히 다 수정해야 할까요??

아마 1년정도 걸릴 것입니다. 이게 말이 됩니까??

너무 비효율 적이고 있어선 안될일입니다.


여기서 관계형 데이터베이스가 빛을 발휘하게 됩니다. 바로 외래키의 존재 때문이죠....


학번 

이름 

성별 

집주소 

학년 

학과코드

20200001

홍길동

남 

경기도 화성 

SWQ

20200002

아무개 

여 

경기도 수원 

TPZ

20200003

이몽룡 

남 

서울 마포 

SWQ

20200004

아름이 

여 

인천 

BML


학과코드 

전공 

대표 전화번호 

SWQ

소프트웨어과 

02-0001 

TPZ 

정보통신과 

02-0002 

BML 

관광과 

02-0003 



이렇게 공통되는 요소들을 분리해서 학과코드 라는 것으로 묶어버릴 수 있습니다.


이렇게 되면 서로다른 2개의 테이블에 같은 컬럼이 존재하게 됩니다.


또한 학번, 이름 등의 정보가 있는 테이블의 데이터가 10만개라 하더라도 전공이나 대표 전화번호가 변경될 경우

학과코드가 있는 테이블에 들어가 수정만 해주면 됩니다.


참 편리하죠?


여기서 우리는 "테이블에 저장된 행을 식별할 수 있는 유일한 값이어야 한다." 라는 의문점을 해결 할 수 있습니다.


학과코드는 다른 테이블에 존재하기 때문에 기본키가 될 수 없죠.


또한 이 학과코드를 기준으로 Join 이라는 명령어를 통해 서로 합친 결과를 도출하는 것도 가능합니다.


6. 복합키

복합키는 기본키가 되지 못하는 컬럼들을 서로 묶어서 기본키처럼 사용하는 것입니다.


예를들어 테이블을 만들고 데이터를 넣었는데, 기본키가 없다면???


10만개의 데이터에서 어떻게 빠르고 쉽게 데이터를 찾을 수 있을까요??


거의 불가능에 가깝습니다.(인덱스를 사용하면 되지만.... 여기선 인덱스 존재를 모른다고 하죠)


이때 복합키를 사용해야 하는데, 복합키는 2개 이상의 컬럼을 묶어서 만들 수 있습니다.


예를들어 이름과 사는 곳을 묶어서 복합키로 만들 수 있고,

이름과 사는곳을 묶었는데도 중복데이터가 발생한다면? 성별로 또 묶을 수 있고

이름과 사는곳, 성별로 묶었는데도 중복데이터가 발생한다면? 생일로 묶을 수 있고... 등....


기본키의 조건에 만족할때까지 컬럼들을 묶어주면서 복합키를 완성시키면 됩니다.


하지만 복잡하죠..... ㅠ

때문에 기본키를 만드는 것이 중요하며,

복합키 또한 최대한 컬럼을 적게 묶는것이 중요합니다.


저렇게 하려면 테이블을 어떻게 구성해서 만드는가가 핵심이겠죠!!


7. 마치며

DB를 처음 공부했을 때 이런게 왜있는지... 딱딱한 개념 설명들이 머리에 안들어오고
이해도 안됐었습니다. 하지만 공부를 하다보니 대충 머리에 들어오면서 퍼즐조각들이 맞춰지더군요...

그래서 제가 예전에 의문점을 갖고 있던 부분들을 좀 이해하기 쉽게 예시를 들면서 설명했는데....

잘 설명이 됐나 모르겠네요.

긴 글 봐주셔서 감사합니다.



반응형

'프로그래밍 > DB' 카테고리의 다른 글

DB란? DBMS와 다른점은 뭘까?  (0) 2020.11.06

댓글


스킨편집 -> html 편집에서