정규화
Normalization
관계형 데이터베이스
의 설계에서
중복을 최소화하기 위해 데이터를 구조화하는 프로세스를 정규화라고 합니다.정규화의 기본 목표
- 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현하는 것
- 테이블 간에 중복된 데이터를 허용하지 않는다는 것
- 중복된 데이터를 허용하지 않음으로써
:무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.
✔️ 비정규화
복잡한 쿼리 속도를 높이고 성능을 향상시키기 위해 테이블에 중복 데이터를 추가하는 프로세스입니다.
✔️ 관계형 데이터베이스(RDB)
테이블, 행, 열의 정보를 구조화하는 방식입니다. RDB에는 테이블을 조인하여 정보 간 관계 또는 링크를 설정할 수 있는 기능이 있어, 여러 데이터 포인트 간의 관계를 쉽게 이해하고 정보를 얻을 수 있습니다.
정규화 장점
- 데이터베이스 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
- 정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장 시,
그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다. - 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 미치게 되어 응용프로그램의 생명을 연장시킨다.
- 이상 현상의 발생 가능성을 줄일 수 있다.
정규화 단점
- 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다.
- 질의에 대한 응답 시간이 느려질 수도 있다.
- 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한
테이블의 데이터 용량이 최소화되는 효과가 있다. - 따라서 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.
- 만약 조인이 많이 발생하여 성능 저하가 나타나면 반정규화(De-normalization)를 적용할 수도 있다.
- 연산 시간이 증가한다.
정규화 단계
이러한 테이블을 분해하는 정규화 단계는
테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라진다.
- 일반적으로 제1정규형부터 보이스/코드(BCNF) 정규형까지 단계별로 질행합니다.
- 정규화는 실제 데이터 값이 아닌 개념적 측면에서 수행되어야 합니다.
- 실제 정규화 과정은 정규형 순서와 다를 수 있습니다.
(상황에 따라 어떤 정규형은 건너 뛸 수도 있다.)
제1 정규화
- 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것 (각 컬럼이 하나의 속성만을 가져야 한다.)
- 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
- 각 컬럼이 유일한(unique) 이름을 가져야 한다.
- 칼럼의 순서가 상관없어야 한다.
정규화가 필요한 테이블
⬇️
정규화 이후
제2 정규화
- 제1 정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것
- 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다.
== 모든 칼럼이 완전 함수 종속을 만족해야 한다.
⬇️
정규화 후
제3 정규화
- 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것
- 2 정규형을 만족해야 한다.
- 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.
정규화가 필요한 테이블
⬇️
정규화 후
BCNF 정규화
- 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것
- 3정규형을 만족해야 한다.
- 모든 결정자가 후보키 집합에 속해야 한다.
정규화가 필요한 테이블
⬇️
정규화 후
제4 정규화 이상
역정규화
정규화를 거치면 릴레이션 간의 연산(JOIN 연산)이 많아지는데,
이로인해 성능이 저하될 우려가 있습니다.
- 역정규화를 하는 가장 큰 이유는
성능 문제가 있는(읽기작업이 많이 필요한) DB의 전반적인 성능을 향상시키기 위함입니다.
(참고)
공부한 내용을 여러글과 책 읽은 내용을 바탕으로 정리하고 있습니다.
좋은 글로 저의 공부에 도움을 주시는 분들께 감사드립니다.