본문 바로가기

데이터베이스

정규화

용어

이상 현상

💡 하나의 테이블에 너무 많은 속성들이 들어갔거나 여러 종류의 종속 관계를 하나의 릴레이션에 표현하는 등 테이블 설계가 잘못된 경우 릴레이션 조작 시 예상치 못한 현상이 발생하는 것을 말한다.

 

삽입 이상

데이터를 삽입하는 과정에서 필요한 데이터임에도 불구하고 삽입할 수 없거나 NULL을 입력해야 하는 현상

위 테이블에서 만약 학번이 400번인 학생의 데이터를 삽입해야 하는데, 학번이 400번인 학생의 과목코드가 정해지지 않아서 값을 입력할 수 없다면 NULL 값을 입력해야 한다. 하지만 과목 코드는 기본키의 구성 요소이기 때문에 NULL 값을 삽입할 수 없다. 이렇게 데이터 삽입시 예상치 못하는 문제가 발생하는 것을 삽입 이상이라고 한다. 

 

삭제 이상

특정 데이터를 삭제함으로 인해서 삭제하면 안되는 정보까지 삭제해야 하는 현상

학번이 300번인 학생의 데이터를 삭제하려했는데 해당 학생이 음악학과의 마지막 학생이라면 300번 학생의 데이터를 삭제하는 순간 음악 학과에 대한 정보를 찾을 수 없게된다. 이렇게 데이터를 삭제할 때 나타나는 문제를 삭제 이상이라고 한다. 

 

갱신 이상

데이터의 중복으로 한 데이터를 수정하는 과정에서 중복된 다른 데이터를 수정하지 않는 경우 데이터의 정합성이 깨지는 현상

학번이 100번인 학생의 학과를 컴퓨터에서 전자로 변경하려고 한다. 첫 번째 행의 데이터는 성공적으로 변경했으나 실수로 3번째 행의 데이터를 변경하지 못했다면 데이터의 불일치가 일어난다. 이렇게 데이터를 수정할때 발생하는 문제를 갱신 이상이라고 한다.

 

함수적 종속성

릴레이션의 X컬럼값을 통해 Y컬럼값을 알 수 있을 때 X컬럼을 결정자, Y컬럼을 종속자라고 한다.
이 때 “Y컬럼은 X컬럼에 함수적 종속성을 갖는다.” 라고 말한다.

화살표를 통해 결정자와 종속자를 표현한다.

 

학번 이름 학과
100 Kim 컴퓨터
200 Park 음악
300 Kim 체육

위 테이블에서 우리가 학번을 안다면 이름, 학과를 알 수 있다. 하지만 이름을 안다고 학번, 학과를 알 수 없다. 동명이인의 경우 학번, 학과가 여러 개일 수 있기 때문이다. 마찬가지로 학과를 안다고 학번, 이름을 알 수 없다. 

 

즉, 위 테이블에서 학번은 이름, 학과를 결정하고 이름, 학과는 학번에 함수적 종속성을 가진다. 

 

 

완전 함수적 종속성 & 부분 함수적 종속성

릴레이션의 모든 기본키 구성 요소에 종속하는 상황을 완전 함수적 종속이라 하고, 기본키가 복합키로 이루어져 있는 경우 기본키의 일부 구성요소에 종속하는 상황을 부분 함수적 종속이라고 한다.

 

위와 같이 A,B가 복합키로 이루어진 테이블에서 E컬럼은 A,B 컬럼을 모두 알아야 결정될 때 E컬럼은 기본키에 완전 함수적 종속성을 가지고 C, D컬럼은 기본키의 구성요소(A,B)의 일부인 B컬럼만으로 결정된다면 C, D컬럼은 기본키에 부분 함수적 종속성을 가진다고 할 수 있다. 

 

이행 함수적 종속성

릴레이션에서 A, B, C라는 3개의 속성이 있을 때 A -> B, B -> C란 종속 관계가 만족하는 경우 이행 함수적 종속이라고 한다. 

 

정규화

위키백과에 나온 정의는 다음과 같다.

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

즉, 정제되지 않은 하나의 큰 테이블을 서로 연관된 데이터만 존재하도록 테이블을 작게 분해하는 과정을 의미한다. 참고로 테이블을 분해하고나서 새롭게 정의된 테이블끼리 조인하여 원래의 테이블의 데이터를 손실 없이 조회할 수 있어야한다. 이를 무손실 분해라고 한다.

 

정규화를 통해 데이터의 중복을 최소화하고, 이상 현상을 줄이며 결과적으로 데이터 구조의 안정성을 최대화 시킬 수 있다. 

정규화는 제6정규형까지 존재하며, 조사한 바로는 일반적으로 제3정규형~BCNF까지만 만족하면 정규화됐다고 표현한다고 한다. 

 

제1정규화

릴레이션에 속한 모든 도메인이 원자값이어야 한다. → 모든 열과 행의 중복지점에는 한 개의 값을 가져야 한다.

 

제1정규형 불만족 테이블

학번 이름 과목번호 주소
100 Kim CS100, CS300 강남
200 Park CS300, CS500 노원
300 Lee CS100, CS500 왕십리

위 테이블의 과목번호 컬럼을 보면 하나의 칸에 2개 이상의 데이터가 들어있다. 이런 경우가 제1 정규형을 만족시키지 못한 테이블이고 

제1 정규형을 만족시키기 위해서 다음과 같이 하나의 칸에는 하나의 데이터만 존재하도록 변경해줘야 한다.

 

제1정규형 만족 테이블

학번 이름 과목번호 주소
100 Kim CS100 강남
100 Kim CS300 강남
200 Park CS300 노원
200 Park CS500 노원
300 Lee CS100 왕십리
300 Lee CS500 왕십리

 

제2정규화

제1정규형을 만족하면서 모든 후보키에 대해 부분함수적종속성이 없어야 한다.

 

다음 테이블은 제2정규형을 만족시키지 못한 테이블이고, 기본키가 (학번, 과목번호)복합키인 테이블이다.

 

제2정규형을 불만족하는 테이블

학번(PK) 학과이름 학과전화번호 과목번호(FK) 학점
100 컴퓨터 111-1111 CS100 A+
100 컴퓨터 111-1111 CS200 B
200 음악 222-2222 CS100 B
300 컴퓨터 111-1111 CS300 C+

위 테이블을 제2정규형을 만족하는 테이블로 분해하려면 부분함수적종속성을 제거해줘야 한다.

 

우선 함수적 종속성을 파악해보자

학점 컬럼은 (학번, 과목번호) 즉, 기본키의 구성요소를 모두 알아야만 결정되고, 학과이름과 학과전화번호는 과목번호의 값과는 상관없이 학번에 의해서만 결정된다. 다르게 말하면 학점은 기본키에 완전 함수적 종속성을 가지고, 학과이름, 학과전화번호는 기본키에 부분 함수적 종속성을 가진다. 

 

제2정규형을 만족하기 위해선 테이블 분해를 통해 이 부분 함수적 종속성을 제거해줘야 한다.

 

다음과 같이 부분 함수적 종속성을 가졌던 컬럼을 하나의 테이블로 분해하고, 완전함수적 종속성을 가졌던 컬럼을 하나의 테이블로 분해하면 결과적으로 제2정규형을 만족하는 2개의 테이블로 분해된다. 

 

제2정규형을 만족하는 테이블

학번 과목번호 학점
100 CS100 A+
100 CS200 B
200 CS100 B
300 CS300 C+
학과 학과이름 학과전화번호
100 컴퓨터 111-1111
100 컴퓨터 111-1111
200 음악 222-2222
300 컴퓨터 111-1111

이때, 두 번째 테이블은 정확히 중복되는 데이터가 존재하기 때문에 이런 중복을 제거해줄 수 있다. 

참고로, 부분 함수적 종속성은 테이블의 기본키가 복합키인 경우에만 나타나기 때문에 제1정규형을 만족하면서 기본키가 단일키인 경우는 제2정규형을 만족한다고 할 수 있다. 

 

제3정규화

제2정규형을 만족하면서 키가 아닌 모든 애트리뷰트가 테이블의 기본 키에 이행적으로 종속하지 않는 것이다.

즉, 키의 부분집합이 아닌 속성 사이에는 함수적 종속성이 없어야 한다는 것을 의미한다.

 

다음 테이블은 제3정규형을 만족하지 않으며 학번이 기본키인 테이블이다.

 

제3정규형을 불만족하는 테이블

학번(FK) 학생이름 학과이름 학과전화번호
100 Kim 컴퓨터 111-1111
200 Park 음악 222-2222
300 Lee 컴퓨터 111-1111

위 테이블의 함수적 종속성을 따져보면 다음과 같이 나타낼 수 있다.

 

학번은 기본키이기 때문에 모든 컬럼을 결정한다. 하지만 학과전화번호를 보면 학과이름에 함수적 종속성을 가지는 것을 알 수 있다. 

즉, 학번 -> 학과이름 -> 학과전화번호 관계가 충족되는 것이다. 이를 이행 함수적 종속성이라 하고 테이블 분해를 통해 이런 이행 함수적 종속성을 제거해줘야 한다. 

 

제3정규형을 만족하는 테이블

학번 학생이름 학과이름
100 Kim 컴퓨터
200 Park 음악
300 Lee 컴퓨터
학과이름 학과전화번호
컴퓨터 111-1111
음악 222-2222
컴퓨터 111-1111

이때, 두번째 테이블에는 정확히 중복되는 데이터가 존재하기 때문에 이를 제거해줄 수 있다. 

 

장점

- 데이터의 중복을 최소화 할 수 있다.

- 이상현상을 줄일 수 있다.

 

단점

- 테이블이 분해되기 때문에 데이터를 조회할 때 조인을 많이 하게되어 조회 성능이 떨어질 수 있다. 

-> 반정규화를 통해 자주 조회되는 컬럼을 하나의 테이블로 묶어서 조회 성능을 높인다. 

 

 

 

📜 Reference

https://www.youtube.com/watch?v=RXQ1kZ_JHqg&t=699s
https://www.youtube.com/watch?v=EdkjkifH-m8&t=163s
https://www.youtube.com/watch?v=-bLCtP2HNHo&t=1133s