Skip to content

Latest commit

 

History

History
139 lines (83 loc) · 7.53 KB

정규화(Nomalization).md

File metadata and controls

139 lines (83 loc) · 7.53 KB

🟠 정규화

DB 정규화는 데이터의 중복을 줄이고, 
무결성을 개선하기 위해 정규화 단계에 따라 관계형 데이터 베이스를 구조화하는 프로세스

정규화 단계에 따라 이루어지는 만큼, 이전단계를 충족시키지 못하면 다음 단계로 가는 것은 불가능하다. 즉, 비정규화의 형태를 가지고 최고 레벨의 정규화를 달성하는 것을 목표로 첫번째 레벨부터 정규화가 충족되도록 해야한다.

🔸 제 1정규화 (1NF)

테이블의 column이 원자값(하나의 값, Atomic Value)를 갖도록 테이블을 분해해야 햔다. 하나의 컬럼안에는 하나의 데이터 value만 가질 수 있다는 뜻이다.

지금 예시 데이터에서는 '박세리', '추신수' 라는 사람들은 여러개의 취미를 갖고있다. 이는 '제1정규화를 만족하지 못했다'라고 부른다. 그렇기 때문에 제 1정규화(1NF)를 진행하여 제 1정규화(1NF)를 만족하는 테이블로 만들어줘야한다.

image

이렇게 하게 되면 하나의 컬럼에 하나의 value가 들어간, 원자값을 갖는, 제 1정규화를 만족시키는 데이터 테이블이 된다.

🔸 제 2정규화 (2NF)

제 2정규화란, 1NF를 진행한 테이블에 대해, 완전함수종속을 만족하도록 테이블을 분해하는 것이다.

📌 완전함수 종속이란?

완전함수 종속이란? 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미한다. 그니까, 한 테이블에서 오직 'primary key'만 종속적인 관계를 가질 수 있다. 정규화가 잘 된 테이블을 수록, 결정자 X는 한개, 그리고 Y값은 여러개를 갖는다.

image

조금 더 쉽게 보고자 데이터를 가져와봤다.

image

위 데이터를 보면, 이름, 성별, 주소를 판별할 수 있는 고유값은 '주민번호'이다. 그래서 '주민번호'가 PK가 될 것이다. 하지만, '이름'을 보자. '이름'은, 성춘향이라는 여자도 있고 남자도 있다. 주민번호도 다르고, 주소도 다르다. 때문에 이름, 그리고 성별, 주소는 고유의 값을 판별할 수 없기 때문에, PK가 될 수 없다.

이것을 위에서 말한 X 와 Y에 대입해서 생각해보면

X: 주민번호 -> Y1: 이름 식별 가능
X: 주민번호 -> Y2: 성별 직별 가능
X: 주민번호 -> Y3: 주소 식별 가능

이렇게 된다. 이런 구조가 되어야만, '완전 함수 종속'이다! 라고 말한다!


다시, 2NF로 돌아와서

2NF는 완전함수종속을 만족하도록 만든다고 했다. 즉, 위에서 말한 '완전함수종속'을 지킬 수 있도록 테이블을 고쳐주어야한다. 예시로 살펴보자.

image

이 테이블에서는, 학생번호와 수강강좌번호가 PK가 될 수 있어보인다. '수강과목'을 식별하는 PK와, 사람을 식별하는 PK 두개가 있는 것이다. 이것이 완전함수종속을 만족시키지 못햇다고 말하면서, 2NF를 만족시키지 못했다고 말한다. (오직 PK 1개에만 모든 것들이 종속되어야한다.)

이 데이터를 2NF를 진행해보자.

image

🔸 제 3정규화 (3NF)

제 3정규화(3NF)란, 제2정규화(2NF)를 만족한 테이블에 대해서 '이행적 종속'을 없애도록 테이블을 분해하는 것이다.

📌 이행적 종속이란?

XYZ라는 3개의 속성이 있을 때, X->Y, Y->Z라는 종속관계가 있을 경우, X->Z 가 성립될때! 이행적 함수 종속이라고 한다.

image

이 데이터로 보면,

X(이름, 성별) -> Y: 주소
X(주소) -> Y: 지역번호

이렇게 성립한다. 하지만, '주소'도 '지역번호' 통해 알 수있다. 이럴 경우, 이행함수 종속이라고 부르고, 이런 관계를 없애버리는것이 3NF이다.


다시 3NF로 돌아와서

위에서 설명한 방식대로 3NF를 진행해보자. (이행 함수 종속을 없애보자.)

image

지금 학생들이 수강할 계절학기 데이터는 위와 같다. 이 테이블에서는 학생번호는 강좌이름을 결정하고 있고, 강좌번호는 수강료를 결정하고 있다. 이 테이블로 보면, '학생번호'를 탐색할 때 '수강료'까지 같이 탐색하게 된다. 즉, 학생번호를 통해 수강료를 알 수 있기 때문에, 3NF를 만족하지 못하고 있다. 3NF를 진행하면, (학생번호, 강좌이름) 테이블과, (강좌이름, 수강료) 테이블로 분해할 수 있다.

왜 굳이 이렇게 해야할까?

현재 테이블에서 501번 학생이 수강할 강좌를 '데이터베이스'에서 '스포츠경영학'으로 바꿨다고 치자. 이런경우, 501학생 데이터에서 강좌이름을 update하여 바꿔줄 것이다. 이럴때 스포츠 경영학은 수강료가 20000원이 아닌데, 501학생 데이터는수강료를 그대로 20000으로 저장하게 된다. 즉, 강좌이름을 바꾸면서 수강료까지 바꿔줘야하는 불상사가 생기고, 이는 DB가 커질수록 관리의 효율을 떨어뜨린다.

그렇기 때문에 이행적 함수 종속을 꼭 제거해주어야하며, 3NF까지 모두 완료시켜주어야한다.

이 데이터를 3NF 시키면 다음과 같다.

image

🔸 BCNF 정규화

BCNF정규화란 3NF를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다. 예를들어 다음과같은 테이블이 존재한다고 해보자.

image

이예시로 보면,

1. (학생번호, 특강이름) -> (교수)
2. (교수) -> (특강이름)

이런 함수적 종속 관계를 갖는다. 이때, 2.를 보면, PK가 아닌 교수가 '특강이름'과 함수적 종속관계를 갖는다. 여기서의 문제는, 교수가 특강이름을 결정짓는 결정자이지만, 후보키가 아니라는 점이다. 그렇기 때문에 BCNF를 만족하지 못했다 라고 말한다.

그래서 이를 BCNF를 만족시키는 아래와 같은 형태로 분해할 수 있다.

image

📝 Reference

함수 종속 설명 메인 글