정규화
정규화(Normalization)는 테이블 간의 중복된 데이터를 제거하여, 무결성을 유지할 수 있고 DB의 저장 용량 역시 줄이는 방법을 말한다. 테이블을 분해하는 단계에 따라 정규화 단계가 달라진다.
정규화의 장점
•
데이터베이스의 데이터 변경 시 이상 현상(Anomaly)을 제거할 수 있다.
•
새로운 데이터 형의 추가 시 구조를 변경하지 않고 일부만 변경하여 적용할 수 있다.
•
테이블의 중복 데이터가 없기 때문에, DB의 저장 용량이 최소화되는 효과가 있다.
이상현상의 종류
삽입 이상(Insertion Anomaly) : 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 현상
삭제 이상(Deletion Anomaly) : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
갱신 이상(Update Anomaly) : 튜플 갱신 시 데이터의 일부만 갱신되어 일어나는 데이터 불일치 현상
정규화의 단점
•
릴레이션의 분해로 인해 JOIN 연산이 많아지고, 그로 인해 질의에 대한 응답 시간이 느려질 수 있다.
•
JOIN이 너무 많이 발생해 성능이 저하된다면, 반정규화(De-Normalization) 적용이 고려될 수 있다.
제 1 정규화
제 1 정규화는 테이블의 컬럼 값이 원자값(단일의 값)을 갖도록 테이블을 분해하는 것이다.
위와 같은 테이블은 ‘과목’이라는 컬럼에 여러 값을 가지고 있기 때문에 제 1 정규형을 만족하지 못한다. 따라서 위 테이블을 제 1 정규화하게 되면 다음과 같다.
제 2 정규화
제 2 정규화는 제 1 정규형을 만족하는 테이블에 대해, 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 다시 말해, 모든 컬럼의 부분적 종속(Partial Dependency)을 제거한 테이블을 제 2 정규형을 만족하는 테이블이라 말한다.
함수 종속성(FD, Functional Dependency)
어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 종속성이라 한다. A→B로 표기하며, A를 B의 결정자(Determinant)라 하고 A는 B를 결정한다(Determine) 혹은 B는 A에 종속한다(Dependent)라고 표현한다.
완전 함수 종속은 기본키의 부분집합이 결정자가 되어서는 안된다는 것을 의미하는데, 복합 키(Composite Key)의 부분집합에 종속되는 컬럼이 있어서는 안된다고 볼 수 있다.
위의 테이블을 살펴보면, 복합 키가 (학생번호, 과목)이 된다. 성적 컬럼의 경우에는 복합 키 모두에 종속(성적을 알기 위해서는 학생번호와 과목 모두 알아야함)되지만, 지도교수의 경우 과목에만 종속된다(과목만 알면 정해진다). 즉 복합 키의 부분 집합에 종속된다는 의미이다.
위와 같이 종속되는 컬럼을 별도의 테이블로 분리하여 관리하는 것을 제 2 정규화라 부르고, 이를 만족하는 테이블을 제 2 정규형을 만족하는 테이블이라 부른다.
제 3 정규화
제 3 정규화란 제 2 정규형을 만족하는 테이블에서 이행적 종속을 없애도록 테이블을 분해하는 것을 말한다. 이행적 종속은 A→B, B→C가 성립할 때 A→C가 성립하는 것을 의미한다.
조금 더 쉽게 생각하자면, 어떤 컬럼이 기본키와 상관이 없는 컬럼에 종속 된다면 그를 분리하는 것을 말한다.
위 테이블에서는 ID → 등급, 등급 → 할인율, ID → 할인율의 이행 종속성이 성립되므로, 제 3 정규형을 만족하지 않는다. 등급에 의존하는 할인율을 분리하여 아래와 같이 분해하는 것이 제 3 정규화라고 한다.
BCNF 정규화
BCNF 정규화란 제 3 정규형을 만족하는 테이블에서 모든 결정자가 후보키 집합에 속하도록 분해하는 것을 말한다. 모든 결정자가 후보키 집합에 속해야 한다는 뜻은, 후보키 집합에 없는 컬럼이 결정자가 되어서는 안된다는 뜻이다.
위 테이블은 (학생번호, 과목)을 복합 키로 사용하여 지도교수를 알 수 있다. 하지만 같은 과목을 다른 지도교수가 담당하는 경우도 있기 때문에 과목→지도교수 종속은 성립하지 않는다. 하지만 지도교수가 담당하는 과목은 정해져있기 때문에 지도교수→과목 종속은 성립한다. 이를 아래와 같이 분해하는 것은 BCNF 정규화라 한다.