데이터베이스 정규화 - 1NF, 2NF, 3NF

데이터베이스 정규화 - 1NF, 2NF, 3NF

개요

  • 데이터베이스 정규화에서 1NF, 2NF, 3NF 에 대해 알아본다.

데이터베이스 정규화가 왜 필요한지, 함수적 종속성이 무엇인지에 대한 사전지식이 없다면 여기를 참고한다.


정규화(Normalization)

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 한다.

조금 더 이론적으로 접근해 보면 함수적 종속성을 이용해서 연관성 있는 속성들을 분류하고, 각 릴레이션들에서 이상현상이 생기지 않도록 하는 과정을 말한다.

정규화 된 정도를 정규형(Normal Form) 으로 표현하는데, 정규형에는 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF 까지 있다. 비공식적 표현으로는 3NF 가 되었으면 정규화 되었다고 말한다. 3NF 테이블의 대부분이 삽입, 변경, 삭제 이상이 없으며, 3NF 테이블의 대부분이 BCNF, 4NF, 5NF이다.

각 정규형이 되기 위해서는 만족시켜야 할 제약조건들이 있다. 높은 차수의 정규형으로 갈 수록 조건이 까다롭다.


제 1 정규형 (1NF; First Normal Form)

제1정규형에 대한 정의는 조금 모호 한 것 같다. 위키 를 읽어보면 학자들끼리 지나친 논쟁을 하고 있는 것 같다는 생각이 든다.

릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있으면 제1정규형에 속한다.

STUDENT_ID COURSE_ID GRADE STUDENT_NM
20800399 CSE011101, CSE022202, CSE033303 A+, A, B+ 야붕

위와같은 형태의 릴레이션은 제1정규형을 만족하지 않는다. 최소한 아래와 같은 형태가 되어야 제1정규형을 만족한다고 할 수 있다.

관계형 데이터베이스의 릴레이션은 모든 속성이 원자 값을 가지는 특성이 있기 때문에, 최소한 제1정규형을 만족해야 릴레이션이 될 자격이 있다.

STUDENT_ID COURSE_ID GRADE STUDENT_NM
20800399 CSE011101 A+ 야붕
20800399 CSE022202 A 야붕
20800399 CSE033303 B+ 야붕


제 2 정규형 (2NF; Second Normal Form)

제1정규형만 만족시키는 릴레이션에서 부분 함수 종속성을 가지게 되는 경우 삽입이상, 갱신이상, 삭제이상 세가지 이상현상이 모두 나타나게 된다.

제1정규형에 속하면서,
기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제2정규형이다.

제2정규형 부터는 아래 릴레이션으로 설명해본다.

학번 과목코드 성적 학부 등록금
20800399 CSE011101 A+ 컴퓨터공학부 350
20800399 CSE022202 A 컴퓨터공학부 350
20800399 CSE033303 B+ 컴퓨터공학부 350
21300758 MEC011101 F 경영학부 300
21400001 POD032939 C+ 기계공학부 400
21500399 CSE011101 D 컴퓨터공학부 350


위 릴레이션의 함수적 종속성을 살펴보면 아래와 같다.

{학번, 과목코드} -> 성적
{학번, 과목코드} -> 학부
{학번, 과목코드} -> 등록금
학번 -> 학부
학번 -> 등록금
학부 -> 등록금

현재 학번->학부, 학번->등록금 두개의 부분 함수 종속성을 가지고 있다. 이를 제거해 주는 것을 제2정규화라고 한다.

학번, 학부, 등록금 속성을 가지는 학생 릴레이션과 학번, 과목코드, 성적 속성을 가지는 성적릴레이션 둘로 나누어 주면 부분 함수 종속성을 제거할 수 있다.

학번->학부 함수종속성으로 볼때, 학번만으로 학부에 대한 결정을 지을 수 있다는 말이다. 그러나 현재 기본키가 학번, 과목코드로 이루어져 있기 때문에 학번만으로 학부에 대한 결정을 지을 수 있다는 게 의미가 없어진다. 그래서 이를 가능하도록 해주는 과정이 부분 함수 종속성을 제거하는 제2정규화 과정이다.

여기서 학부->등록금 이라는 함수적 종속성은 부분 함수 종속성이 아니다. X -> Y 라는 함수적 종속성에서 부분 함수 종속성, 완전 함수 종속성을 따질 때 결정자 X가 반드시 기본키나 후보키에 속할 필요는 없으므로 현재 학부->등록금 의 함수 종속은 하나의 완전 함수 종속이라고 볼 수 있다.


학번->학부, 학번->등록금 두개의 부분 함수 종속성을 제거하여 분리한 두개의 릴레이션은 아래와 같다.

학생 릴레이션
학번 학부 등록금
20800399 컴퓨터공학부 350
21300758 경영학부 300
21400001 기계공학부 400
21500399 컴퓨터공학부 350
성적 릴레이션
학번 과목코드 성적
20800399 CSE011101 A+
20800399 CSE022202 A
20800399 CSE033303 B+
21300758 MEC011101 F
21400001 POD032939 C+
21500399 CSE011101 D

릴레이션이 둘로 분해되면서 학부와 등록금에 대한 중복항목이 제거되었다. 정규화 과정에서 주의할 점은 정규화를 통해 분해된 릴레이션들이 조인을 통해 원래의 구조로 복원될 수 있어야 한다는 것이다.

두 릴레이션 모두 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되므로 제2정규형을 만족한다.

제 2 정규형을 만족하면 이상현상이 없어질까?

그렇지 않다.

삽입이상
새로운 학부가 생기는 경우 등록된 학생(학번)이 없다면 학번속성이 NULL이 되므로 삽입할 수 없다.

갱신이상
컴퓨터공학부 등록금이 400으로 오르는 경우 20800399, 21500399 둘 모두 바꾸어 주지 않으면 데이터 불일치 문제가 발생한다.

삭제이상
21400001 학번을 가진 학생이 자퇴하는 경우, 기계공학부에 대한 정보가 함께 사라진다.

제2정규형에서도 이상현상이 발생하는 이유는 이행적 함수 종속이 존재하기 때문이다. 이행적 함수 종속을 없애주는 과정이 제 3 정규화이다.


제 3 정규형 (3NF; Third Normal Form)

제 2 정규형에 속하면서,
기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속이 되지 않으면 제 3 정규형이다.

이행(移行)적 함수 종속 (Transitive Functional Dependency)
이행적? 뭔가 와닿지 않아서 transitive 뜻을 찾아봤더니 ‘타동사의’ 라는 뜻이.. 있는데 드물게 ‘옮아가는’ 이라는 의미로도 쓰인다. 옮길 이, 다닐 행 자를 써서 옮기고 다닌다? 뭐 이런 뜻같다.

그래서 이행적 함수 종속이라는 게 뭐냐하면 삼단논법 같은 관계를 가진 함수종속이다. X, Y, Z 에 대해 X->Y 이고 Y->Z 이면 X->Z 가 성립한다. 이를 Z 가 X 에 이행적으로 함수 종속되었다고 한다.

지금 학생 릴레이션에서 함수적 종속성은 아래와 같다.

학번 -> 학부
학부 -> 등록금
학번 -> 등록금

논리적으로 말은 되는데 의미상 뭔가 이상하다. 학부에 따라 등록금이 결정되는 것이지 학번에 따라 결정되는 것은 아니다. 그냥 이걸 둘로 분리 해주면 된다.

X->Y, Y->Z 함수적 종속관계로 인해 X->Z 의 이행적 함수 종속 관계가 나타나면 [X, Y], [Y, Z] 두 릴레이션으로 분해한다.

분리하여 이행적 종속 관계를 제거 한 학생 릴레이션과 학부 릴레이션은 아래와 같다.

학생, 학부 릴레이션
학생, 학부 릴레이션

제 3 정규형을 만족하면 이상현상이 없어질까?

그렇지 않다.

지금까지 살펴본 세가지 릴레이션에서는 기본키가 될 수 있는 후보키가 하나 밖에 없었다. 하지만 후보키를 여러개 가지고 있는 릴레이션에서는 제3정규형을 만족하더라도 이상현상이 생길 수 있다.

이를 해결하기 위한 정규형이 보이스-코드 정규형 (BCNF; Boyce-Codd Normal Form)이다. 제3정규형보다 조금 더 엄격한 제약조건을 가지기 때문에 Strong 3NF 라고도 한다.

다음 포스팅에서 BCNF에 대해 알아본다.


참고한 자료

Comments

Yaboong's Picture

Yaboong

오스카 쉰들러는 흔해빠진 기회주의자요 부패한 사업가였다. 그러나 거대한 악이 세상을 점령하는 것처럼 보일 때 그 악에 대항해서 사람의 생명을 구한 것은 귀족도 지식인도 종교인도 아닌 부패한 기회주의자 오스카 쉰들러였다.

Seoul, South Korea https://github.com/yaboong