정규화란?
정규화(Normalization)는 관계형 데이터베이스에서 데이터 구조를 체계적으로 정리하는 과정이다.
그러면 왜 정규화가 필요할까?
- 중복 데이터 제거: 중복 데이터를 최소화하여 저장 공간 절약 및 데이터 일관성 유지.
- 데이터 무결성 보장: 데이터 이상 현상을 방지하고 데이터 간 논리적 관계를 보장.
- 데이터 이상(Anomaly) 방지:
- 삽입 이상: 데이터를 추가할 수 없는 상태 방지.
- 삭제 이상: 데이터 삭제 시 관련 정보가 유실되는 상황 방지.
- 갱신 이상: 데이터가 불필요하게 중복되어 일관성이 깨지는 현상 방지.
그러면 정규화를 통해 데이터가 깔끔해지긴 하지만, 모든 경우에 항상 정규화가 최선일까라는 의문이 들 수 있다. 최선이 아닌 경우 우리는 반정규화 개념을 사용할 수 있다.
반정규화(De-normalization)란?
반정규화는 데이터베이스 성능 향상을 위해 정규화를 일부 해제하는 과정으로, 조회 성능이 중요한 시스템에서 사용되며, 데이터 중복을 허용하는 대신 읽기 속도를 개선할 수 있다.
상황에 따라 데이터 중복을 허용하는 것이 시스템 전체의 성능을 높이는 열쇠가 될 수 있기에, 적재적소에 반정규화를 활용해야 한다.
정규화는 그러면 어떤 과정으로 이루어질까?
정규화 과정은 1에서 5까지 있다. 하나하나 살펴보겠다.
정규화 과정
제1정규형 (1NF)
- 테이블의 모든 속성 값이 원자값(Atomic Value)으로 이루어져야 합니다.
- 예시:
- 비정규형: 주문(주문ID, 고객명, 주문품목)에서 주문품목이 여러 값을 포함.
- 1NF: 주문(주문ID, 고객명, 주문품목)에서 각 주문품목을 개별 행으로 나눔.
- 비정규형
주문ID 고객명 주문품목 1 존 스미스 노트북, 스마트폰 주문ID 고객명 주문품목 1 존 스미스 노트북 1 존 스미스 스마트폰
데이터의 최소 단위를 명확히 정의하는 것이 1NF의 핵심이다.
제2정규화 (2NF)
- 1NF를 만족해야 한다. (모든 속성 값이 원자값이어야 함)
- 기본 키에 대해 부분 함수 종속성이 없어야 한다.
- 즉, 기본 키의 일부만을 기준으로 다른 속성이 종속되지 않도록 해야 한다.
- 예시:
- 1NF: 주문(주문ID, 고객명, 제품ID, 제품명)에서 제품명이 제품ID에만 종속.
- 2NF: 주문(주문ID, 고객명)과 제품(제품ID, 제품명)으로 분리.
1NF
주문ID | 고객명 | 제품ID | 제품명 |
1 | 존 스미스 | A1 | 노트북 |
1 | 존 스미스 | A2 | 스마트폰 |
2NF
주문 테이블
주문ID | 고객명 |
1 | 존 스미스 |
제품 테이블
제품ID | 제품명 |
A1 | 노트북 |
A2 | 스마트폰 |
주문-제품 테이블
주문ID | 제품ID |
1 | A1 |
1 | A2 |
2NF는 데이터를 논리적으로 분리함으로써 중복성을 더 줄일 수 있다.
제3정규화 (3NF)
2NF를 만족하고, 이행적 함수 종속성을 제거해야 한다.
- 이행적 함수 종속성이란, A → B, B → C 관계가 존재할 때 A → C가 되는 상황이다.
- 예시:
- 2NF: 학생(학번, 학과, 학과위치)에서 학과위치가 학과에 종속.
- 3NF: 학생(학번, 학과)와 학과(학과, 학과위치)로 분리.
2NF
학번 | 학과 | 학과위치 |
1001 | 컴퓨터공학 | 3층 |
1002 | 전자공학 | 2층 |
3NF
학생 테이블
학번 | 학과 |
1001 | 컴퓨터공학 |
1002 | 전자공학 |
학과 테이블
학과 | 학과위치 |
컴퓨터공학 | 3층 |
전자공학 | 2층 |
이행적 종속성을 제거하면 데이터가 더욱 명료해진다.
BCNF (Boyce-Codd Normal Form)
3NF를 만족하며 모든 결정자가 후보 키여야 한다.
- 결정자란 다른 속성 값을 고유하게 결정하는 속성이다.
- 예시: 수업(교수ID, 강의실, 시간)에서 강의실과 시간이 결정자.
3NF
교수ID | 강의실 | 시간 |
1 | A101 | 10시 |
1 | A102 | 11시 |
BCNF 교수 테이블
강의실 | 교수ID |
A101 | 1 |
A102 | 1 |
강의실 테이블
시간 | 강의실 |
10시 | A101 |
11시 | A102 |
BCNF는 후보 키와 결정자의 관계를 명확히 정리해준다.
제4정규화 (4NF)
- 다치 종속성을 제거하여 데이터 중복을 최소화해야 한다.
- 다치 종속성이란 하나의 속성이 다른 두 속성에 독립적으로 종속되는 경우를 말한다.
- 예시: 프로젝트(학생, 팀)에서 학생이 여러 팀에 속할 수 있는 구조를 분리.
3NF (다치 종속성 포함)
- {식당} ↠ {음식 종류}
- {식당} ↠ {배달 지역}
- 음식 종류와 배달 지역은 관계가 없는 독립적인 관계이다. 하지만 같은 테이블 식당 컬럼에 다치 종속되어 중복이 발생한다.
식당 | 음식 종류 | 배달 지역 |
A 치킨 | 후라이드 | 하남 |
A 치킨 | 후라이드 | 용인 |
B 치킨 | 후라이드 | 안성 |
B 치킨 | 양념치킨 | 하남 |
B 치킨 | 양념치킨 | 용인 |
C 치킨 | 간장치킨 | 용인 |
4NF
식당-음식 종류 테이블
식당 | 음식 종류 |
A 치킨 | 후라이드 |
B 치킨 | 후라이드 |
B 치킨 | 양념치킨 |
C 치킨 | 간장치킨 |
식당-배달지역 테이블
식당 | 배당 지역 |
A 치킨 | 하남 |
A 치킨 | 용인 |
B 치킨 | 하남 |
B 치킨 | 용인 |
B 치킨 | 안성 |
C 치킨 | 용인 |
다치 종속성을 해결하면 테이블 구조가 더 깔끔해진다.
제5정규화 (5NF)
- 중복을 제거하기 위해 분해할 수 있을 만큼 전부 분해하는 것으로,
- 제 4정규형을 만족하고
- 조인 종속성을 제거하여 복합 키 조인 시 데이터 중복 방지 해야 한다.
- 조인 종속성이란 다중 관계를 분리했을 때 테이블을 다시 조인 하여도 원래 데이터가 유지되는 경우를 말한다.
- 그리고, 조인 연산을 했을 때 손실이 없어야 한다.
- 원래 데이터에서는 음식 종류와 배달 지역이 독립적이었지만, 조인 후에는 음식 종류와 배달 지역 간 관계가 있는 것처럼 보이는 중복 데이터가 생성되었다.
식당 | 음식 종류 | 배달 지역 |
A 치킨 | 후라이드 | 하남 |
A 치킨 | 후라이드 | 용인 |
B 치킨 | 후라이드 | 하남 |
B 치킨 | 후라이드 | 용인 |
B 치킨 | 후라이드 | 안성 |
B 치킨 | 양념치킨 | 하남 |
B 치킨 | 양념치킨 | 용인 |
B 치킨 | 양념치킨 | 안성 |
C 치킨 | 간장치킨 | 용인 |
식당-음식 테이블
식당 | 음식 종류 |
A 치킨 | 후라이드 |
B 치킨 | 후라이드 |
B 치킨 | 양념치킨 |
C 치킨 | 간장치킨 |
식당-지역 테이블
식당 | 배달 지역 |
A 치킨 | 하남 |
A 치킨 | 용인 |
B 치킨 | 하남 |
B 치킨 | 용인 |
B 치킨 | 안성 |
C 치킨 | 용인 |
음식-지역 테이블
음식 종류 | 배달 지역 |
후라이드 | 하남 |
후라이드 | 용인 |
양념치킨 | 하남 |
양념치킨 | 용인 |
간장치킨 | 용인 |
5NF로 정규화하면 조인 종속성을 제거하여 데이터 중복 없이 원래 데이터를 복원할 수 있다.
\5NF는 데이터베이스 설계의 최종 정돈 단계라고 할 수 있다.
'Database' 카테고리의 다른 글
클러스터링과 리플리케이션에 대하여 (2) | 2024.12.27 |
---|---|
RDBMS vs NoSQL (0) | 2024.12.26 |
데이터베이스의 특징에 대해서 알아보자. (2) | 2024.12.24 |