본문 바로가기

DataBase

DB - 정규화(Normalization)

정규화(Normalization)란?

관계형 데이터베이스에서 데이터의 중복을 최소화하기 위한 목표를 가지고 컬럼의 관계를 고려하여 테이블을 설계를 재구성하는 프로세스이다. 일반적으로 테이블을 여러개로 분해하게되면 속도는 상대적으로 느려질 수 있지만, 아래와 같은 문제들이 발생하게 된다.

- 데이터를 저장할 때 원하지 않는 정보가 함께 추가 - 삽입 이상

- 레코드(=튜플)을 삭제함으로써 유지되어야 하는 정보까지도 연쇄적으로 삭제될 수 있음 - 삭제 이상

- 중복된 레코드들 중 일부의 속성만 갱신 시킴으로써 정보의 모순성이 발생 - 갱신 이상

 

정규화는 테이블을 분해하는 단계가 정의되어 있는데, 어떻게 분해하는지에 따라 그 단계가 달라진다.

제1 정규화 (1NF(=First Normal Form))

"관계형 데이터베이스의 테이블이 1NF이면 최소한 테이블은 관계이며, 중복되는 항목이 없어야 한다"

제1정규형 위키확인: https://ko.wikipedia.org/wiki/%EC%A0%9C1%EC%A0%95%EA%B7%9C%ED%98%95

1. 열에는 위-아래의 순서가 없다.

2. 행에는 좌-우의 순서가 없다

3. 중복되는 열이 없다.

4. 모든 열과 행의 중복지점에는 해당되는 분야에서 한 개의 값을 가진다.

5. 모든 행은 규칙적이다.

=> 위의 조건을 충족하지 않는 테이블은 엄격히 보면 관계형이 아니다. 즉, 테이블의 컬럼이 원자값(=하나의 값)을 갖도록 테이블을 분해해야한다.

 

[예제 테이블]

고객번호 성씨 이름 전화번호
1 윤상 010-1111-2222
2 길동 010-1234-5678
3 몽룡 010-5678-1234
4 춘향 010-9876-5432

고객이 전화번호를 여러개를 가져야할 상황에서 어떻게 데이터를 저장할 것인가?

 

회원번호 성씨 이름 전화번호
1 윤상 010-1111-2222, 010-3333-4444
2 길동 010-1234-5678
010-9999-9999
3 몽룡 010-5678-1234
4 춘향 010-9876-5432

=> 1번, 2번회원: 구분자 혹은 줄바꿈하여 번호를 여러개 추가 - 행에서는 정확하게 한 개의 값만을 허용해야한다.

고객번호 성씨 이름 전화번호 전화번호2
1 윤상 010-1111-2222 010-3333-4444
2 길동 010-1234-5678  
3 몽룡 010-5678-1234  
4 춘향 010-9876-5432  

=> 이러한 경우 고객의 전화번호의 유일성을 확보하기 어렵다.

 

그렇다면, 1정규화를 충족하려면, 어떻게 분해해야할까?

=> 원자성을 갖도록 테이블을 분해하였다.

제2정규화 (2NF)

"1NF가 진행된 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해한다."

완전 함수 종속은, X1, X2 -> Y (X1와 X2가 Y의 값을 결정) 하는 것이고, 부분 함수적 종속은, X1 -> Y or X2 -> Y (X1 또는 X2가 Y의 값을 결정)이다. 따라서, 2NF에서는 부분 함수적 종속을 제거해야 한다.

고객번호 이름 전화번호 성별
1 장윤상 010-1111-2222 남자
2 홍길동 010-1234-5678 남자
3 이몽룡 010-5678-1234 남자
4 성춘향 010-9876-5432 여자

기존에는 고객번호와 이름으로 성별을 결정할 수 없던 상황이였다. 그리고 성별은 이름으로만 식별이 가능하므로 위와같이 테이블을 분해하여 별도로 테이블을 관리하여 제2정규형을 만족하였다.

제3정규화 (3NF)

"2NF를 만족하는 이행적 종속을 제거한다."

이행적 종속은 X -> Y 이고, Y -> Z가 성립할때 X -> Z가 성립한다는 내용이다.

해당 테이블은 2NF까지는 만족하지만, 이행적 종속을 충족하고있다. {대회, 연도}가 우승자를 결정하며, {우승자}가 우승자 생년 월일을 결정하고있기 때문이다.

우승자 생년 월일을 분해하였고 {대회, 연도}를 의존하게 되는 이행적 함수 종속 관계가 아닌 [우승자 생년 월일 -> 우승자]가 되고, [우승자 -> {대회, 연도}]가 되면서 완전 함수적 종속 관계가 된다. 제3정규형을 만족하였다.

BCNF(Boyce-Codd Normal Form) 정규화

"3NF가 진행된 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해한다"

(!) 후보키: 각 행을 유일하게 식별할 수 있는 최소한의 속성들의 집합.

이번에는 특강수강 테이블이 있다고하자. 여기서 기본키(멀티키)는 {학생번호, 특강이름}이다. 그리고 이 키들은 교수가 누구인지를 결정하고있다. 그런데, 교수컬럼은 특강이름을 결정하고 있다. 따라서 교수컬럼은 결정자이지만 후보키가 아니다.

특강수강테이블을 특강신청, 특강교수 테이블로 분해하여 BCNF 정규화를 만족하였다.

참고자료

= https://mangkyu.tistory.com/110

= https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%A0%95%EA%B7%9C%ED%99%94

 

'DataBase' 카테고리의 다른 글

DB - 복합키 순서  (0) 2022.04.05
DB - Replication  (0) 2022.03.22
DB - 실행계획(explain) 보는방법  (0) 2022.03.13
DB - Bulk Insert  (0) 2022.03.13
DB - 인덱스(Index) (B+Tree Index)  (0) 2022.03.06