DB 개념 - 정규화 (Normalization)

jin·2023년 4월 17일
0

DB 개념

목록 보기
4/5

정규화가 필요한 이유

위 그림에서, dept_name이 Physics인 경우, building과 budget을 유추 할 수 있다.
dept_name 별 building, budget을 가진 테이블이 별도로 있다면, 데이터가 중복해서 저장되는 것을 피할 수 있다.

이러한 정보의 반복은, 데이터 저장 공간 낭비 뿐만 아니라 다른 문제들을 야기 할 수 있다.

예를 들어,
아직 dept 배정을 받지 않은 교수가 테이블에 삽입 될 때, (dept_name, building, budget) column에 Null 값이 발생한다.
논리적으로 문제가 되진 않지만, 의도치 않게 Null값이 발생하는 것은 바람직한 상황이 아니다.
DB에서 NULL 값을 올바르게 다루기 위해서 추가적으로 고려 해야 할게 생기기 때문이다.

추가로, Physics 학과의 building이 변경되는 경우를 생각해보자.
이 경우 table 내의 Physics 학과의 모든 데이터를 조회하고 수정해야 한다.
이 때문에 데이터 관리 어려움이 증가하고, 데이터 불일치 현상이 발생 할 가능성이 높아진다.
학과 별 정보를 관리하는 테이블이 따로 있었다면, Physics 학과의 정보에 대해 1건의 수정만으로 해당 작업을 완료 할 수 있을 것이다.

적절한 정규화는 DB를 운영/관리 하는데 있어 도움이 된다.

Decomposition ?

테이블을 분리하는 것을 의미한다.

예를 들어, 위의 사진에서
Instructor (ID, name, salary, dept_name, building, budget) 테이블을
다음과 같이 2개로 분리 할 수 있다.

  • Instructor (ID, name, salary) + Department (dept_name, building, budget)

정규화 단계

정규화 단계에 따라 6단계로 구분 할 수 있다.
정규화에 '정답'은 없으며, 적절한 정규화 단계를 선택하여 DB를 운용하고, 필요한 경우 비정규화하기도 한다.

  1. 1NF
  2. 2NF
  3. 3NF
  4. BCNF (Boyce-Codd Normal Form
  5. 4NF
  6. 5NF

1NF

제 1 정규형은, 릴레이션에 속하는 속성의 속성 값이 모두 원자 값으로 구성되어야 한다.

위 테이블에서 (추신수, [영화, 음악]) 처럼 어떤 row가 한 column 에 여러개의 값을 가지는 경우 '멀티 벨류를 가진다'고 하며,
이 경우 1NF 를 만족하지 못한다.

2NF

제 2 정규형은, 제 1 정규형을 만족하면서, 테이블의 모든 속성이 PK 에 완전 함수 종속 해야 한다.

완전 함수 종속 ?

A->B 종속성이 성립 할 때,
B는 A 집합 전체에 함수 종속하고, A 의 부분 집합에 대해서는 함수 종속 하지 않는 경우
이를 '완전 함수 종속' 이라고 한다.
즉, PK 에 완전 함수 종속 하기 위해서는 기본키의 부분 집합이 기본키가 아닌 속성을 종속적으로 결정하지 못해야 한다.

예시를 통해 확인해보자.

이 테이블의 PK는 (학생번호, 강좌이름) 이다.
그런데, (학생번호) -> (성적), (강좌이름) -> (강의실) 처럼 PK 의 부분 집합이 PK 가 아닌 속성에 대해 종속성을 가지고 있다.
따라서 해당 테이블은 2NF 를 만족하지 못한다.

3NF

제 3 정규형은, 제 2 정규형을 만족하면서, PK가 아닌 속성이 PK에 대해 이행적 함수 종속되지 않아야 한다.
다르게 표현하면, PK 이외의 속성이 그 외 다른 속성을 결정 할 수 없는 것을 의미한다.

이행적 함수 종속 (Transitive dependency) ?

A->B, B->C 가 성립 할 때, A->C 가 성립하는 종속성

PK 이외의 속성이 다른 기본키에 포함되지 않는 속성을 결정할 수 없어야 한다.


다음 테이블에서
학생번호->강좌이름, 강좌이름->수강료 종속성이 성립한다.
PK 는 학생번호이고, PK 가 아닌 속성인 '강좌이름'이 다른 속성을 결정하고 있으므로,
해당 테이블은 3NF를 만족하지 못한다.

BCNF (Boyce-Codd Normal Form)

BCNF는 제 3 정규형을 만족하면서, 모든 결정자가 후보키 집합에 속해야 한다.

이 테이블은, PK 가 아닌 속성인 '지도교수'가 '과목' 속성을 결정하고 있기는 하지만,
'과목' 속성은 PK 에 속한 속성이므로 3NF 에 위배되지 않는다. (즉, 3NF 를 만족한다)

하지만, PK 가 아닌 속성이 결정자이므로, BCNF 는 만족하지 못한다.

결정자 ?

A->B 의 함수 종속성이 있을 때, A를 '결정자'라고 한다.

위 테이블을 BCNF 를 만족하도록 Decomposition 해보자.

다음과 같이 분해하면, BCNF 를 만족한다.

4NF

제 4 정규형은, BCNF 를 만족하면서, 다치 종속이 없어야 한다.

다치 종속 ?

  • A->B 일 때, 하나의 A 값에 대해 여러 개의 B 값이 존재
  • 최소 3개의 Column이 존재
  • R(A, B, C) 일 때, B와 C가 독립적
    위의 조건을 모두 만족하면, A와 B 사이에 다치 종속성을 가진다고 하고, A↠B라고 표시한다.

위의 테이블의 '학생번호와 과목', '학생번호와 취미'는 각각 다치 종속성을 가지므로
위 테이블은 4NF 를 만족하지 못한다.

5NF

제 5 정규형은, 제 4 정규형을 만족하면서, 더 이상 Lossless-Join Decomposition 을 할 수 없어야한다.
즉, 정보가 손실되지 않는 선에서 할 수 있는 모든 분해를 진행한 상태이다.

Lossless-Join Decomposition ?

테이블 T를 T1, T2 로 분해 한 후, 다시 JOIN 했을 때 기존의 T를 만들 수 있다면
이를 Lossless-Join Decomposition 이라고 한다.


위 테이블을 분해하는 2가지 방법에 대해 비교해보자.

방법 1. T1(학생번호, 교수), T2(교수, 특강이름)
T1, T2 의 공통 속성은 (교수)
JOIN 시 원래의 테이블을 만들 수 있으므로, 무손실 분해 규칙을 만족하였다.

방법 2. T1(학생번호, 특강이름), T2(교수, 특강이름)
T1, T2 의 공통 속성은 (특강이름)
JOIN 시 원래의 테이블을 만들 수 없다.
(501 창업전략 홍교수), (501 창업전략 박교수) 와 같이 기존에 없었던 Row 가 생긴다.
이 경우 무손실 분해 규칙을 만족하지 않는다.

0개의 댓글