데이터베이스 정규화는 그 정도에 따라 같은 양의 데이터를 보다 적은 비용으로 관리할 수 있게 해준다. 정규화에 대해 알아보자.
정규화란?
정규화란 데이터 중복과 insertion, update, deletion anomaly를 최소화하기 위해 일련의 normal forms(NF)에 따라 relational DB를 구성하는 과정이다.
정규화의 목적
1. 불필요한 데이터(data redundancy)를 제거하여 불필요한 중복을 최소화
2. 삽입/갱신/삭제 시 발생할 수 있는 각종 이상 현상(Anomaly)를 방지하기 위해서 테이블의 구성을 논리적이고 직관적으로 한다.
정규화 과정
정규화는 실제로 6NF까지 존재하지만, 보통 3NF까지 도달하면 '정규화 됐다'라고 표현하며 BCNF 이후의 단계는 실무에서는 많이 사용하지 않는다. (주로 학술적 단계에서 사용)
1NF (제1 정규화)
제1 정규화는 테이블의 컬럼이 원자값을 갖도록 테이블을 분해하는 것이다. 즉, attribute의 value는 반드시 나눠질 수 없는 단일한 값이어야 한다.
위의 테이블에서 추신수, 박세리는 여러 취미를 가지고 있기 때문에 1NF를 만족시키지 못한다. 제1 정규화를 진행하면 아래와 같은 테이블이 된다.
2NF (제2 정규화)
제2 정규화란 제1 정규화를 진행한 테이블에 대해 완전 함수 종속(Functionally Dependency)를 만족하도록 테이블을 분리하는 것이다. 완전 함수 종속은 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 뜻한다.
즉, 모든 non-prime attribute는 모든 key에 대해 fully functionally dependent 해야 한다.
위의 테이블에서 기본키는 (학생번호, 강좌이름)으로 복합키다. 성적의 경우에는 복합키가 결정하고 있는 반면, 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다. (강좌이름 → 강의실)
즉, 기본키인 (학생번호, 강좌이름) 중 강좌이름이 강의실을 결정짓기 때문에 위 테이블은 2NF를 만족하지 못한다. 따라서 제2 정규화를 진행해 아래의 테이블처럼 분리할 수 있다.
3NF (제3 정규화)
제3 정규화란 제2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분리하는 것이다. 이행적 종속이라는 것은 A → B, B → C가 성립할 때 A → C가 성립되는 것을 의미한다.
즉, 모든 non-prime attribute는 어떤 key에도 transitively dependent하면 안된다.
예를 들어, 위 테이블에서 학생번호가 강좌 이름을 결정하고 있고, 강좌 이름이 수강료를 결정한다. 즉, (학생번호) → (수강료)의 관계가 되기 때문에 이는 3NF를 만족하지 못한다. 제3 정규화를 적용하면 아래와 같이 테이블을 분리할 수 있다.
BCNF
BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
즉, 모든 유효한 non-trivial FD X → Y는 X가 super key여야 한다.
예를 들어 위의 특강수강 테이블에서 기본키는 (학생번호, 특강이름)이다. 그리고 해당 기본키가 교수를 결정하고 있다. 그리고 교수 또한 특강이름을 결정하고 있다.
문제는 교수가 특강이름의 결정자이지만, 후보키가 아니라는 점이다. 그렇기 때문에 BCNF 정규화를 만족시키기 위해 다음과 같이 테이블을 분리시킬 수 있다.
위와 같이 분리하게 되면, BCNF를 만족하게 된다.
반정규화 (Denormalization)
정규화의 반대 과정으로 역정규화라고도 한다. 정규화를 너무 과하게 진행하게 되면 오히려 테이블 수가 많아져 JOIN 비용, 테이블 관리 비용이 커질 수 있다. 그래서 비용을 줄이기 위해 반정규화를 적용하기도 한다.
따라서 DB를 설계할 때 과도한 조인과 중복 데이터 최소화 사이에서 적정 수준을 잘 선택할 필요가 있다.
Reference
https://mangkyu.tistory.com/110
'CS 지식 > Database' 카테고리의 다른 글
[DB] 트랜잭션 (Transaction) (0) | 2024.05.01 |
---|---|
[DB] 인덱스 (Index) (0) | 2024.04.30 |