본문 바로가기
Database

[DB] Database 정규화 (1NF,2NF,3NF,BCNF) 👨‍💻

by pin9___9 2023. 2. 7.
728x90

정규화란?

관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화(Normalization)라고 한다. 데이터베이스 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 
이를 단계별로 구분하여 정규형이 높아질수록 이상현상은 줄어들게 된다.

 

정규화의 목적

  1. 불필요한 데이터(data redundancy)를 제거합니다.
  2. 데이터 저장을 "논리적으로" 합니다.

 

정규화의 장단점

정규화의 장점

  • 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있습니다.
  • 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 됩니다.
  • 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킵니다.

정규화의 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아집니다.
  • 질의에 대한 응답 시간이 느려질 수도 있다. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있습니다. 
  • 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있습니다.
  • 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있습니다.

 

정규화를 안 했을 때

id name age highschool job
1 문동은 36 성한고 교사
2 주여정 34 과학고 의사
3 강현남 48   가사도우미
4 박연진 36 성한고 기상캐스터

위와 같이 정규화가 되지 않은 구조의 테이블('문동은'과 '박연진'의 나이와 학교가 동일하게 들어가 있습니다.)의 경우, 데이터 핸들링 시 다양한 이상현상이 발생하게 됩니다.

 

1. Update : 고등학교가 성한고인 데이터의 job이 변경되었을 때, 여러줄의 데이터를 갱신해야 합니다. 이로 인해 데이터의 불일치(inconsistency)가 발생할 수 있습니다.

 

2. Insert : 만약 강현남과 같이 고등학교를 나오지 않았다면 highschool 컬럼에는 NULL이 들어갈 것입니다.

 

3. Deletion : 만약 강현남이 가사도우미를 그만둔다면 강현남의 레코드가 아예 테이블에서 지워집니다.

 

위와 같이 정규화가 제대로 되지 않은 테이블의 경우 갱신/삽입/삭제 시 다양한 문제점이 발생할 수 있습니다. 이를 테이블의 구성을 논리적으로 변경하여 해결하고자 하는 것이 바로 정규화입니다.

 

제 1 정규형 (1NF)

  1. 각 컬럼이 하나의 속성만을 가져야 합니다.
  2. 하나의 컬럼은 같은 종류나 타입(type)을 가져야 합니다.
  3. 각 컬림이 유일한(unique) 이름을 가져야 합니다.
  4. 컬럼의 순서는 상관이 없어야 합니다.
name dream
문동은 건축가, 교사
박연진 기상캐스터
최혜정 승무원

위 테이블을 보면 1. 각 컬림이 하나의 속성만 가져야 한다는 조건이 위배되고 있습니다.

 

1번 규칙을 불만족하고 있으므로 이를 고치기 위해 테이블을 분해해 줍니다.

name dream
문동은 건축가
문동은 교사
박연진 기상캐스터
최혜정 승무원

 위와 같이 각 컬럼이 원자값을 가지도록 테이블을 분해하면 제 1정규형을 만족시킬 수 있습니다.

 

제 2 정규형 (2NF)

  1. 제 1 정규형을 만족해야 합니다.
  2. 모든 컬럼은 부분적 종속(Partial Dependency)이 없어야 합니다. 즉, 모든 컬럼이 완전 함수 종속을 만족해야 합니다.

✔ 부분적 종속이란

    기본키 중에 특정 컬럼에만 종속되는 것입니다.

 

✔ 완전 함수 종속이란

    기본키의 부분집합이 결정자가 되어선 안된다는 뜻입니다.

 

 

위와 같은 테이블과 FD 다이어그램이 있습니다.

성적의 특정 값을 알기 위해서는 학생 번호+과목이 있어야 합니다.

하지만 특정 과목의 지도교수는 과목명만 알면 지도교수가 누군지 알 수 있습니다.

 

위 테이블에서 기본키는 (학생 이름, 과목)으로 복합키입니다. 

그런데 이때 지도교수 칼럼은 (학생 이름, 과목)에 종속되지 않고 (과목) 에만 종속되는 부분적 종속입니다. 

 

따라서 제2 정규화를 만족하지 않으므로 아래와 같이 분해해야 합니다.

 

제 3 정규형 (3NF)

  1. 제 2 정규형을 만족해야 합니다.
  2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 합니다.

✔ 이행 종속성이란?

     A->B, B->C 일 때 A->C 가 성립하면 이행 종속이라고 한다. 

 

name subject price
김대한 Javascript 20,000
이민국 Python 10,000
박만세 Java 40,000
조한국 C# 50,000

기존의 테이블에서 학생 이름은 과목과 수강료를 결정하고 있고, 과목은 수강료를 결정하고 있습니다.

이행 종속을 제거하기 위해 (이름, 과목)테이블과 (과목, 수강료)테이블로 분해해줘야 합니다.

 

이행 종속을 제거하는 이유는 김대한 학생이 수강하는 과목이 Python으로 변경이 된다면 Python과목을 20,000원에 결제를 하고 수강을 해야 합니다. 과목만 변경하기 위해서 가격까지 변경해야 하는 번거로움이 있기 때문에 그 번거로움을 해결하기 위해 제 3 정규화를 하는 것입니다.

 

제 3 정규화를 위해 아래와 같이 분해해줍니다.

 

 

BCNF 정규화

  1. 제 3 정규형을 만족해야 합니다.
  2. 모든 결정자가 후보키 집합에 속해야 합니다.

위와 같은 테이블을 보자. (학생, 과목)이 기본키로 지도교수를 알 수 있습니다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어서 과목-> 지도교수 종속은 성립하지 않습니다. 하지만 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 지도교수-> 과목 종속이 성립합니다.

 

이처럼 후보키 집합이 아닌 칼럼이 결정자가 되어버린 상황을 BCNF를 만족하지 않는다고 합니다. 

(참고로 위 테이블은 제3 정규형까지는 만족하는 테이블입니다 )

 

BCNF를 만족하기 위해서는 아래와 같이 분해하면 됩니다.

 

728x90

댓글