정규화 (Normalization)
함수적 종속성(functional dependency - 참고링크)을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해하여 이상 현상(anomaly - 참고링크)이 발생하지 못하도록 릴레이션을 만드는 것을 말한다. 즉 기본적으로는 관련이 없는 함수 종속성은 별개의 릴레이션으로 표현한다.
이상 현상은 단순히 데이터의 무결성을 해치는 문제도 발생시키지만 중복된 값에 대한 여러 연산을 수행하게 만든다는 점에서 성능 저하도 가져올 수 있어 정규화를 통해 가능한 이상 현상을 방지하는 것이 데이터베이스 성능 부분에서도 도움이 된다.
단 정규화를 할 때 분해는 무손실 분해(nonloss decomposition)여야 한다. 즉 릴레이션이 의미상 동등한 릴레이션들로 분해되고, 분해로 인한 정보 손실이 없어야 한다. 또한 분해된 릴레이션들은 조인을 통해 원래의 릴레이션으로 만들 수 있어야 한다.
정규형 (NF, Normal Form)
릴레이션이 정규화된 정도로 각 저유형마다 제약조건이 존재한다. 정규형의 차수가 높아질수록 요구되는 제약조건이 많아지고 엄격해진다. 일반적으로는 제3정규형에서 보이스-코드 정규형까지 정규화한다.
그러나 무조건 정규형의 차수를 높이는 것이 항상 좋은 것은 아니다. 정규화의 차수를 높인다는 것은 결국 릴레이션을 더 작게 분해한다는 의미이기 때문에, 이로 인해 정보에 접근하는 과정이 복잡해지고, 질의 성능이 저하될 수 있으며, 실제 시스템 구현이나 유지보수가 어려워질 가능성이 높다. 따라서 데이터의 무결성과 효율적인 데이터 처리의 균형점을 적절한 수준에서 선택하고 이에 맞는 정규형 수준에서 데이터베이스를 정규화하는 것이 권장된다.
제1정규형 (1NF)
릴레이션의 모든 속성이 더 이상 분해되지 않는 원자값(atomic value)만 가지면 제1정규형을 만족한다. 제1정규형을 만족해야 관계 데이터베이스 릴레이션으로 사용할 수 있다.
그러나 제1정규형을 만족한다고 이상 현상(anomaly)이 없어지지는 않는다. 기본키에 부분 함수 종속(PFD)되는 속성이 계속 존재하기 때문에 이상 현상이 발생할 가능성은 여전히 있고, 이상 현상 없이 데이터를 삽입, 수정, 삭제하려고 하더라도 여전히 많은 리소스가 들어가는 문제가 남아있는 상태이다.
제2정규형 (2NF)
제1정규형을 만족하면서 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속(FFD)되면 제2정규형을 만족한다.
제2정규형을 만족시키기 위해 제1정규형에 속하는 릴레이션에서 부분 함수 종속을 제거하고 모든 속성이 기본키에 완전 함수 종속되도록 분해해야 한다.
함수 종속성 다이어그램으로 나타내면 다음과 같다.
그러나 제2정규형을 만족하더라도 이상 현상이 발생할 수 있다. 왜냐하면 이행적 함수 종속은 처리하지 못하기 때문이다. 예를 들어서 다음과 같은 테이블을 생각해보자.
부분 함수 종속성이 없으므로 제2정규형은 만족한다. 그러나 신성원의 번호를 바꾼다고 해보자. 여전히 문제가 발생한다. 여전히 여러개 행의 값을 변경해야 하고, 강좌를 배정받지 않은 교원 데이터를 삽입할 때, 특정 강좌가 삭제될 때 교원 데이터도 같이 삭제되는 문제 역시 발생한다. 즉 이상 현상이 여전히 발생한다.
제3정규형 (3NF)
제2정규형을 만족하면서 기본키가 아닌 모든 속성이 기본키에 이행적 함수 종속되지 않는다면 제3정규형을 만족한다.
제3정규형을 만족시키기 위해서는 모든 속성이 기본키에 이행적 함수 종속이 되지 않도록 분해해야 한다.
예를 들어서 위에서 설명한 제2정규형은 만족하지만 이행적 함수 종속이 존재하는 강의 테이블을 다음과 같이 분해한다.
위와 같이 분해하면 제3정규형을 만족하게 된다. 함수 종속성 다이어그램으로 나타내면 다음과 같다.
보이스-코드 정규형 (BCNF, Boyce-Codd Normal Form)
제3정규형을 만족하더라도 하나의 릴레이션에 여러 개 후보키가 존재한다면 이상 현상이 발생할 수 있다. 예를 들어 아래와 같은 테이블이 있다고 하자.
이때 항공사 코드와 항공편 번호를 묶어 기본키로 사용하고, 이에 따라 다음과 같은 함수적 종속성이 존재한다.
$$ (\text{항공사 코드}, \text{항공편 번호}) \to \text{항공기 번호} $$
그런데 항공기는 항공사에 속해있으므로 항공기 번호만으로 항공사를 특정할 수 있다. 즉 다음과 같다.
$$ \text{항공기 번호} \to \text{항공사 코드} $$
그렇다면 이상 현상이 발생할 수 있다. 예를 들어 항공편이 없는 항공기를 인계받았을 때 데이터를 삽입하거나, 항공기가 다른 항공사로 넘어간다거나 하는 등 상황이 발생하면 문제가 생긴다.
이를 방지하는 거싱 보이스-코드 정규형이다. 보이스-코드 정규형을 만족하기 위해서는 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키여야 한다.
따라서 위 테이블을 아래와 같이 분해하는 것으로 보이스-코드 정규형을 만족시킬 수 있다.
함수 종속성 다이어그램으로 보면 다음과 같다.
제4정규형 (4NF)
릴레이션이 보이스-코드 정규형을 만족하면서 함수 종속이 아닌 다치 종속(MVD, multi valued dependency)을 제거하면 제4정규형을 만족한다.
제5정규형 (5NF)
릴레이션이 제4정규형을 만족하면서 후보키를 통하지 않는 조인 상속(JD, join dependency)을 제거하면 제5정규형을 만족한다.
'Computer Science and Engineering > Database' 카테고리의 다른 글
[DB] 장애(failure) 및 회복(recovery) (0) | 2025.06.04 |
---|---|
[DB] 트랜잭션(transaction) (0) | 2025.06.04 |
[DB] 이상 현상(anomaly) 및 함수적 종속성(FD, functional dependency) (0) | 2025.06.02 |
[DB] 인덱스(index) (0) | 2025.06.02 |
[DB] B-트리(B-tree) (0) | 2025.06.02 |