키와 정규화(Key and Normalization)

상위문서 : 데이터베이스

필수참고문서 : 함수적 종속


목차

1. 개요
2. 키의 종류
3. 정규화의 종류


1.개요

키는 릴레이션에서 튜플들을 유일하게 구별하는 속성 또는 속성들의 집합이다. 데이터 구조를 구성하거나 접근하고 보관하고 무결성을 보장하고 일정하게 유지해준다.
만약 일반 파일 시스템에서는 사원번호가 123인 번호가 이미 있는데 인사직원의 실수로 123 사원번호가 신입사원에게 배정되었다면 이것을 관리하기 위한 알고리즘이 없는 이상 중복되는 사원번호가 생겨버린다.

정규화는 데이터베이스 설계에서 중복을 최소화 하게 데이터를 재구조화를 하는 프로세스를 정규화라고 한다. 또한 필요에 따라서 역으로 정규화를 할 수 있는데 이것을 역정규화라고 한다.

2. 키의 종류


  1. 슈퍼키(Super key) -유일성을 만족하는 키이다. 즉 기본키의 유니크 속성 예를 들어  게임 아이디에서 (게임 닉네임+ 게임 아이디), (게임 닉네임), (게임 아이디) 또는 (게임 아이디 소유자 이름 + 거주지)같은 것이다. 참고로 키는 튜플들이 모여서 키가 될 수 있으므로 (게임 아이디+ 게임 아이디) 는 두 가지 다른 튜플이 모여서 키를 이룬 것이라고 할 수 있다.
  2. 후보키(Candidate Key) - 유일성과 최소성을 만족하는 키이다. 위에서 게임 아이디는 중복되게 만들 수 있나..
  3. 기본 키(Primary Key) - 후보키 중에서 기본적으로 사용하기 위해 선택한 키이다.
  4. 대체 키(Surrogate Key) - 기본 키로 선택되지 못한 후보키이다. 위에서 게임 아이디를 기본 키로 선택했다면 게임  닉네임은 대체키가 된다.
  5. 외래키(Foreign Key) - 다른 릴레이션의 기본 키를 참조하는 키이다. 참조하는 릴레이션 : 외래키를 가진 릴레이션, 참조되는 릴레이션 : 외래키가 참조하는 기본키를 가진 릴레이션

3. 정규화의 종류

정규화의 종류는 제1정규화 제2정규화 제3정규화 BCNF, 4정규화 ,5정규화 등이 있다.
하지만 보통은 제 2정규화까지만 사용하고 많아봐야 BCNF까지 사용한다.
그래서 종류의 소개에는 1~3정규화와 BCNF까지만 소개 및 설명한다.

1. 제 1 정규화(1NF)
테이블에 있는 모든 속성의 레코드 값이 원자값을 가지고 있는 형태를 말한다.
반복되는 그룹 속성이 존재할 경우 그 그룹을 분리하여 새로운 테이블을 추가한다. 여기서 이의가 많겠지만 원자값이란 알기 쉽게 설명하면 최소한의 쪼갤 수 있는 데이터의 한계이다. 만약 주민등록번호를 앞자리와 뒷자리로 정할 수도 있고 앞자리 뒷자리 둘다 합친것을 한 뭉텅이로 저장할 수 있다. 어느것을 선택하든 설계자가 원자값이 있다고 하면 있는것이다. 엿장수가 가위를 몇번치냐면 그것은 엿장수 마음대로이다......

 이름
 거주지
전화번호 
철수
부산 
010-4985-xxxx 
영희 
서울
010-5494-xxxx

위와 같은 테이블이 있다. 여기서 이름을 고유 키로 잡는다. 그런데 철수가 업무상 전화번호가 2개 생겼다고 치자 그러면 아래와 같은 테이블이 된다.
 이름
 거주지
전화번호 
철수
 부산
010-4985-xxxx,
010-5876-xxxx
영희 
 서울
010-5494-xxxx

이 예제에서 전화번호는 한 컬럼안에 두 개의 전화번호를 지니게 되었고 이것은 기존 설계에서 생각한 원자값과 일치하지 않는다. 그렇다면 어떻게 할까? 여기서 반복되는 그룹 속성이 존재할 경우 그 그룹을 따로 분리하여 테이블을 만든다. 여기서 반복되는 속성은 전화번호이다. 그렇다면 다음과 같이 제1정규화가 가능하다.
거주지 테이블
 이름
 거주지
철수
 부산
영희 
 서울

전화번호 테이블
 이름
전화번호 
철수
010-4985-xxxx
철수
010-5876-xxxx
영희 
010-5494-xxxx

로 두 테이블로 쪼개주고 거주지 테이블의 이름을 전화번호 테이블에 외래 키로 잡아주면된다.

2. 제 2 정규화(2NF)
테이블이 1NF를 만족하고 테이블의 애트리뷰트들이 완전 함수적 종속인 테이블을 제 2 정규화가 됬다고한다.
여기서 완전 함수적 종속이란 테이블에서 애트리뷰트 x가 다른 단일 혹은 복합 애트리뷰트  y에 함수적 종속이면서 다른 어떤 애트리뷰트도 함수적 종속이 아닐 때 x는 y의 완전 함수적 종속이라고 한다.
주민등록번호 앞자리
주민등록번호 뒷자리 
이름
생년월일 
거주지 
 890903
1234567 
철수 
1989-09-03
부산 
 950406
2234566 
영희 
1995-04-06 
서울

위와 같은 테이블이 있다고 하자. 여기서 고유 키는 주민등록번호 앞자리와 뒷자리로 잡는다. 다들 알다싶이 한국은 생년월일을 기준으로 주민등록번호 앞자리를 생성한다는 것을 알고 있다.
따라서 주민등록번호 앞자리는 생년월일을 결정한다. 또한 앞자리와 뒷자리가 합쳐서 이름과 생년월일 거주지 전부를 지칭할 수 있다. 하지만 앞자리와 뒷자리가 합쳐서 생년월일을 지칭하는것은 완전 함수적 종속을 위반한다.
주민등록번호 앞자리
주민등록번호 뒷자리 
이름
생년월일 
거주지 
 890903
1234567 
철수 
1989-09-03
부산 
 950406
2234566 
영희 
1995-04-06 
서울
└-------------------------└------------------------┘-------------------------------------------------┘
└--------------------------------------------------------------------------------┘
이렇게 선을 그어 종속되는 애트리뷰트들을 나눠보면 더 쪼개기 편하다.
앞자리*뒷자리-> 이름*거주지
앞자리-> 생년월일

따라서 위 테이블을 쪼개주면 다음과 같이 된다.

주민등록 테이블
주민등록번호 앞자리
주민등록번호 뒷자리 
이름
거주지 
 890903
1234567 
철수 
부산 
 950406
2234566 
영희 
서울

생년월일 테이블
주민등록번호 앞자리
생년월일 
 890903
1989-09-03
 950406
1995-04-06 

로 쪼개주고 생년월일 테이블의 주민등록번호 앞자리를 주민등록 테이블의 외래키로 잡아주면된다.

3. 제 3정규화(3NF)
2NF를 만족하고(2NF는 1NF를 만족해야하므로 자동적으로 3정규화는 2NF와 1NF를 만족한다.) 후보키가 아닌 애트리뷰트들에서 이행 종속이 없는 테이블을 제 3정규화가 됬다고 한다.
여기서 이행 종속이란 x->y이고 y->z이면 x->z인 애트리뷰트들을 말한다.
 학번
 이름
 학과
학과건물
 201039485
철수
항공우주공학과
항공관
 201149856
민수
기계공학과기계공학관
 201438875
영희
화학공학과
화학과

위 테이블은 학번이 고유 키이다.
여기서 각각 애트리뷰트의 함수적 종속을 선으로 나타내어보면 다음과 같다.
 학번
 이름
 학과
학과건물
 201039485
철수
항공우주공학과
항공관
 201149856
민수
기계공학과기계공학관
 201438875
영희
화학공학과
화학과
└-----------------------------┘-------------------------------┘
                                                                      └--------------------------┘
학번이 학과를 학과는 학과건물을 지칭하는 것이다.

학번-> 학과-> 학과건물 이다.
따라서 이것을 쪼개보면 다음과 같다.

학생 테이블

 학번
 이름
 학과
 201039485
철수
항공우주공학과
 201149856
민수
기계공학과
 201438875
영희
화학공학과

학과 테이블

 학과
학과건물
항공우주공학과
항공관
기계공학과기계공학관
화학공학과
화학과

으로 나타내어지며 학생 테이블의 학과를 학과 테이블의 학과와 외래키로 연결시켜주면 된다.

4. BCNF
3NF를 만족하고 모든 결정자는 후보키야만 한다.

수강신청 테이블

 학번
과목 
교수 
 201039485
경영과학
영희
 201149856
전자기학
철수
 201438875
공학설계학
지성

여기서 고유 키는 학번과 과목이다. 이 테이블을 선을 이용하여 함수적 종속을 표현하면 다음과 같다.

                                                               ---------------------------------------------↖
 학번
과목 
교수 
 201039485
경영과학
영희
 201149856
전자기학
철수
 201438875
공학설계학
지성
└--------------------------------------------------------------------------------------↗

학번과 과목이 교수를 지칭할 수 있지만 교수는 또 과목을 지칭하는 것이다. 이럴때는 다음과 같이 쪼개준다.

수강학생 테이블

 학번
교수 
 201039485
영희
 201149856
철수
 201438875
지성
과목학생 테이블

과목 
교수 
경영과학
영희
전자기학
철수
공학설계학
지성
이렇게 겹치는 애트리뷰트를 기준으로 테이블을 쪼개면된다. 겹치는 애트리뷰트는 교수이므로 두 테이블은 교수를 외래키로 연결해주면된다. 

on 2017년 6월 12일 월요일 | A comment?
0 responses to “키와 정규화(Key and Normalization)”

Leave a Reply

최근 많이 본 글