정규화 (Normalization)
데이터베이스에서 중복을 최소화하고 데이터의 일관성을 유지하기 위해 관계형 데이터베이스(RDBMS) 스키마를 재구성하는 과정
정규화의 목적
- 불필요하거나 중복되는 데이터(data redundancy)들을 제거한다.
- 이상현상(Anomly)을 방지한다.
- 데이터베이스 구조를 확장에 용이하도록 한다.
이상현상(Anomaly)의 종류
삽입 이상(Insertion Anomaly): 데이터를 삽입할 때 데이터의 부분적인 정보로 인해 원하는 데이터를 삽입할 수 없는 현상
갱신 이상(Update Anomaly): 데이터를 업데이트할 때 일부 튜플만 갱신되어 데이터의 불일치가 발생하는 현상
삭제 이상(Deletion Anomaly): 데이터를 삭제할 때 의도하지 않은 데이터의 손실이 발생하는 현상
하지만, 정규화를 과도하게 수행할 경우, 테이블 간의 조인 연산이 많아져서 성능이 저하될 수 있다.
정규화 단계
제 1정규화(1NF)
모든 속성의 도메인이 원자값(Atomic Value)만으로 구성되도록 테이블을 분해한다.
조건
1. 각 속성은 더 이상 분해할 수 없는 단일 값으로 구성되어야 한다.
2. 중복된 데이터가 없어야 한다.
3. primary key를 사용하여 각 집합을 고유하게 식별할 수 있어야 한다.
예시)
제 1정규화를 만족하지 않는 테이블
제 1정규화를 만족하는 테이블
제 2정규화(2NF)
조건
1. 제 1정규화를 만족해야 한다.
2. 완전 함수 종속성을 만족해야 한다.
즉, 기본 키가 아닌 속성이 다른 속성에 종속되어 있는 경우 이를 별도의 테이블로 분리하는 것이다.
예시)
제 2정규화를 만족하지 않는 테이블
위 테이블에서 'Manufacturer Country' 컬럼은 'Manufacturer'에 의존한다. 즉, 'Model'과 'Manufacturer Country'는 아무런 연관관계가 없다. 결국 완전 함수 종속성을 충족시키지 못하고 있다.
제 2정규화를 만족하는 테이블
제 3정규화(3NF)
조건
1. 제 2정규화를 만족해야 한다.
2. 기본키가 아닌 속성들은 기본키에 의존한다.
즉, A가 B에 종속되고 B가 C에 종속되어 있을 경우, A와 C를 독립적인 두 개의 테이블로 분리하는 것이다.
예시)
제 3정규화를 만족하지 않는 테이블
위 테이블에서 'Winner'은 'Tournament'과 'Year'에의해 결정되며, 'Date of Birth'는 'Tournament'가 아니라 'Winner'에의해 결정된다. 따라서 'Winner'을 Primary Key로 하는 새로운 테이블을 생성해야 한다.
제 3정규화를 만족하는 테이블
BCNF(Boyce-Codd Normal Form)
조건
1. 제 3정규화를 만족해야한다.
2. 모든 결정자가 후보키 집합에 속해야 한다.
예시)
BCNF를 만족하지 않는 테이블
위 테이블에서 '학생번호'와 '과목'을 기본키로 지도교수를 알 수 있다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어서 '지도교수'가 '과목'에 종속되는 것은 성립하지 않는다. 하지만 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 '과목'이 '지도교수'에 종속되는 것은 성립한다.
이처럼 후보 키인 '과목'이 아니라 '지도교수'가 결정자가 되어버린 상황을 BCNF를 만족하지 못한다고 한다. 따라서 BCNF를 만족하기 위해서는 아래와 같이 분해하면 된다.
BCNF를 만족하는 테이블
BCNF이상으로 정규화를 하면 정규화의 단점이 나타날 수 있기 때문에 보통 BCNF 까지만 정규화를 진행한다.
단점: 조인 연산이 많아지고 이로 인해 성능이 저하될 수 있다.
단점을 해결하기 위해 역정규화를 하기도 한다.
[참고] https://gyoogle.dev/blog/computer-science/data-base/Normalization.html
https://code-lab1.tistory.com/48
'Computer Science > Database' 카테고리의 다른 글
[Database] 트랜잭션 격리 수준 (Transaction Isolation Level) (0) | 2023.07.16 |
---|---|
[Database] 트랜잭션 (Transaction) (0) | 2023.07.07 |
[Database] 인덱스 (Index) (0) | 2023.06.30 |
[Database] 이상 현상 (Anomaly) (0) | 2023.06.30 |
[Database] SQL vs. NoSQL (0) | 2023.06.23 |