728x90
DB 정규화 (Normalization) 란?
데이터베이스 정규화는 관계형 데이터 모델에서 데이터의 중복성을 제거하여 이상 현상을 방지하고,
데이터의 일관성과 정확성을 유지하기 위해 무손실 분해하는 과정이다.
데이터베이스 정규화 목적
- 중복 데이터를 최소화하여 테이블 불일치 위험 최소화
- 수정, 삭제 시 이상 현상 최소화함으로써 데이터 구조의 안정성 최대화
- 어떠한 릴레이션이라도 데이터베이스 내에서 표현 가능
- 데이터 삽입 시 릴레이션 재구성에 대한 필요성 줄이기
- 효과적인 검색 알고리즘 생성
| 이상 현상이란?
이상 현상은 릴레이션 조작 시 데이터들이 불필요하게 중복되어 예기치 않게 발생하는 문제 현상
| 이상 현상의 종류
- 삽입 이상 (Insertion Anomaly)
- 튜플 삽입시 지정하지 않은 속성값이 NULL을 갖거나, 원하지 않는 값들도 함께 삽입되는 현상
- 삭제 이상 (Delete Anomaly)
- 릴레이션에서 한 튜플을 삭제할 때 의도와는 상관없는 값들도 함께 연쇄 삭제되는 현상
- 갱신 이상 (Update Anomaly)
- 데이터 갱신 시, 일부 튜플의 정보만 갱신되어 정보의 모순이 생기는 현상
데이터베이스 정규화 단계
단계 | 조건 |
1정규형 (1NF) | 원자 값으로 구성 |
2정규형 (2NF) | 부분 함수 종속 제거 (완전 함수적 종속 관계) |
3정규형 (3NF) | 이행 함수 종속 제거 |
보이스-코드 정규형 (BCNF) | 결정자가 후보 키가 아닌 함수 종속 제거 |
4정규형 (4NF) | 다치(다중 값) 종속성 제거 |
5정규형 (5NF) | 조인 종속성 제거 |
[ 1차 정규화 (1NF) ]
- 테이블 내의 속성값은 원자값을 가져야한다.
- 취미에 속성이 2개 이상 가지고 있을 경우, 원자값이 아니기 때문에 속성 1개만 가지도록 저장해야한다.
[ 2차 정규화 (2NF) ]
- 제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해한다.
- 완전 함수 종속은 기본키의 부분집합이 결정자가 되어선 안 된다는 것을 의미한다.
위 테이블을 보면, [고객명, 서비스 이름]이 [서비스 기간]에 영향을 주고, [서비스 이름]이 [서비스 가격]에 영향을 주는 관계를 부분 함수 종속 관계라고 한다. [고객명, 서비스 이름, 서비스 가격, 서비스 기간] 을 한 테이블에 두면, 부분 함수 종속성으로 2차 정규화를 만족하지 못한다. 따라서, 별도의 테이블로 두어야 2차 정규화를 만족할 수 있다.
[ 3차 정규화 (3NF) ]
- 모든 속성이 기본키(또는 복합키)에 이행적 함수 종속이 되지 않아야 한다.
- X → Y이고 Y→Z면 X→Z가 되는 관계를 이행적 함수 종속이라고 한다.
[ 보이스코드 정규화 (BCNF) ]
- 제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해한다.
DB 비정규화 (Denormalization) 란?
데이터베이스 비정규화는 하나 이상의 테이블에 데이터를 중복해 배치하는 최적화 기법이다.
시스템의 성능 향상, 개발 및 운영의 편의성 등을 위해 정규화된 데이터 모델을 통합, 중복, 분리하는 과정으로, 의도적으로 정규화 원칙을 위배하는 행위이다.
데이터베이스 비정규화 장단점
| 장점
- 빠른 데이터 조회 가능 → 조인 비용 감소
- 살펴봐야할 테이블이 줄기 때문에 데이터 조회 쿼리가 간단해진다.
| 단점
- 데이터 갱신이나 삽입 비용 높음
- 데이터 갱신 또는 삽입 코드 작성하기 어려움
- 데이터를 중복하여 저장하므로 더 많은 저장 공간 필요
비정규화 대상
- 자주 사용되는 테이블에 액세스하는 프로세스의 수가 많고, 항상 일정한 범위만을 조회하는 경우
- 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
- 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우
✅ 비정규화 사용
대부분의 대규모 IT 업체의 경우처럼, 규모 확장성(scalability)을 요구하는 시스템의 경우 거의 항상 정규화된 데이터베이스와 비정규화된 데이터베이스를 섞어 사용한다.
참고
| https://owlyr.tistory.com/20
| https://mangkyu.tistory.com/110
728x90
'Database' 카테고리의 다른 글
[MySQL] WITH, WITH RECURSIVE 사용법 (0) | 2022.10.10 |
---|---|
[DB] Transaction 트랜잭션 (0) | 2022.10.10 |
[DB] Index & B-Tree (2) | 2022.10.05 |
[DB] SQL vs NoSQL (4) | 2022.10.03 |
[DB] SQL Injection (2) | 2022.09.30 |