본문 바로가기
2024 웹/DataBase(DB)

FOREIGN KEY(외래키)

by concho 2024. 2. 29.

예시:

학생정보 

 

학생 id => 기본 키 학생 이름 수강 과목
2017_001 홍길동 국어, 수학
2017_002 홍상진 국어
2017_003 김상진 수학
2017_004 이병철 영어
2017_005 이병철 영어

이 테이블은 DB의 제1 정규형을 무시하는 테이블 

2017_001 학생은 수강 과목에서 2개의 속성값을 가지고 있기 때문에 제1 정규형에 위배

 

제1 정규형은 왜 지켜야 할까?

  1. 데이터 중복 최소화: 한 열에 여러 값이 들어갈 경우, 정보의 중복이 발생할 수 있습니다. 이는 데이터베이스의 크기를 불필요하게 증가시키고, 데이터 간의 일관성을 유지하기 어렵게 만듭니다. 예를 들어, '수강 과목' 열에 '국어, 수학'과 같이 여러 과목을 저장하면, 특정 과목에 대한 정보를 수정할 때 여러 레코드를 찾아 수정해야 할 수도 있습니다.
  2. 데이터 무결성: 제1 정규형을 따르면 데이터의 무결성을 유지하기 쉬워집니다. 각 열이 원자값만을 가지므로, 데이터를 추가, 수정, 삭제할 때 발생할 수 있는 오류를 줄일 수 있습니다. 예를 들어, 수강 과목을 개별적으로 관리하면, 특정 학생이 어떤 과목을 수강하는지 명확히 파악하고 관리할 수 있습니다.
  3. 쿼리 성능 향상: 제1 정규형을 만족하는 테이블은 쿼리를 작성하고 실행할 때 더 나은 성능을 보입니다. 각 열이 원자값을 가지고 있기 때문에, 검색, 정렬, 집계 등의 작업이 더 효율적으로 이루어질 수 있습니다. 만약 '수강 과목' 열이 여러 과목을 포함한다면, 특정 과목을 찾기 위해서는 문자열을 파싱하는 등의 추가 작업이 필요할 수 있습니다.

 


그럼 간단하게 2017_001 학생의 정보를 하나 더 추가하면?

학생 id => 기본 키 학생 이름 수강 과목
2017_001 홍길동 국어
2017_001 홍길동 수학
2017_002 홍상진 국어
2017_003 김상진 수학
2017_004 이병철 영어
2017_005 이병철 영어

 

그냥 추가하게 된다면 데이터 수가 늘어나게 되고 => 용량 많이 차지

기본키 는 하나만 존재해야 한다는 규칙에 위배

 

그럼 기본키는 왜 하나만 존재해야 하나?

이를 알기 위해서는 먼저 DB가 어떤 방식으로 자료를 찾는지 확인할 필요가 있다.

일단 가장 간단한 탐색 방법은 그냥 DB의 첫번째 줄부터 순차적으로 탐색하는 것이다

ex)

2017_003 이라는 키를 찾으려면

컴퓨터는 첫번째 줄부터

2017_001, => 불일치

2017_001, => 불일치

2017_002, => 불일치

2017_003,  ====> 일치! (찾음)

이런 식으로 탐색하게 될 것이다.

 

이런 탐색 방식은 데이터가 적을때는 유의미한 시간 차이를 느끼지 못하지만 데이터 수가 많아질수록

탐색해야 하는 라인 수가 많아져 탐색하는데 많은 시간이 걸리게 된다.

 

따라서 DB의 탐색 방식은 아래 그림과 같은 B Tree 라는 트리 구조의 알고리즘에 따라 탐색하게 된다.

=> 물론 DB종류에 따라 알고리즘이 상의할 순 있음

이런 동작 방식은 트리 구조로 되어있고 만약 기본키가 여러개 라면

오류가 생기거나 leaf node에 추가되었다고 해도 항상 기본키 하나만 탐색할 수 있게 된다.

ex)

23-C 옆에 22-B(상진)가 중복되어 추가되었다고 하면 트리 구조상 branch node에서 22-B 를 찾을때는 항상 왼쪽 방향으로 탐색을 하기 때문에 상진이는 더이상 찾을수가 없다.

(=> 물론 이 예시는 논리적 비약이 심합니다. 자세한 내용은 B Tree 알고리즘을 검색해 찾아보는 것이 정확)

https://kyungyeon.dev/posts/66

 

DB Index 동작원리를 알아보자

B-Tree를 통해 알아보는 Index 동작 원리

kyungyeon.dev

  

결론은 기본키는 꼭! 하나만 존재해야 한다는 것이다.

 


이제 기본키는 하나이고, 속성도 하나만 있어야 한다는 이유는 알게 되었다.

 

그럼 이제 수강 과목이 여러개인 사람을 어떻게  DB에 잘 저장 할수 있을까?

 

제 2 정규화를 사용하자!

다음은 그 예시이다.

 

학생 테이블

학생 id => 기본 키 학생 이름
2017_001 홍길동
2017_002 홍상진
2017_003 김상진
2017_004 이병철
2017_005 이병철

 

수강 테이블

수강 id => 기본 키 학생 id => 외래 키 수강 과목
001 2017_001 국어
002 2017_001 수학
003 2017_002 국어
004 2017_003 수학
005 2017_004 영어
006 2017_005 영어

 

이렇게 나눌 수 있다.

=> 이걸 제 2 정규화 라고 함.

'2024 웹 > DataBase(DB)' 카테고리의 다른 글

관계형 데이터베이스 기본1  (0) 2024.02.26
오라클(DB) 11g xe 다운로드  (0) 2024.02.26

댓글