이상 현상 (Database Anomalies)
데이터베이스를 잘못 설계하면 불필요한 데이터 중복이 발생하며, 릴레이션의 데이터에 대한 연산 작업을 수행할 때 문제가 생길 수 있다. 이를 “이상 현상(Anomaly)”이라고 한다. 이러한 이상 현상을 제거하면서 데이터베이스를 올바르게 설계하는 과정이 “정규화(Normalization)”이다. 이상 현상은 “삽입 이상”, “갱신 이상”, “삭제 이상”으로 분류된다.
- `삽입 이상(Insertion Anomaly)`: 릴레이션에 새 데이터를 삽입해야 할 때, 불필요한 데이터도 함께 삽입되는 문제를 말한다.
- `갱신 이상(Update Anomaly)`: 릴레이션의 중복된 튜플들 중, 일부만 수정되어 데이터가 불일치하게 되는 문제를 말한다.
- `삭제 이상(Deletion Anomaly)`: 릴레이션에서 튜플을 삭제할 때, 필수적인 데이터까지 함께 삭제되어 데이터가 손실되는 문제를 말한다.
함수 종속성 (Functional Dependency)
하나의 릴레이션을 구성하는 속성들의 부분 집합을 $X$와 $Y$라 할 때, 어느 시점이든 릴레이션 내의 모든 튜플에서 $X$값에 대한 $Y$이 항상 하나이면 “$X$가 $Y$를 함수적으로 결정한다.” 또는 “$Y$가 $X$에 함수적으로 종속되어 있다.” 라고 표현한다. 함수 종속 관계는 “$X \rightarrow Y$로 표현하며 이때, $X$를 결정자, $Y$를 종속자라고 한다.하나의 릴레이션을 구성하는 속성들 간의 함수 종속 관계를 도식화하여 표현할 수 있는데, 이를 함수 종속 다이어그램이라고 한다.
함수 종속 관계를 판단할 때, 현재 시점에 릴레이션에 포함된 속성 값만으로 판단하면 안 된다. 그 이유는 릴레이션에서 속성 값은 가변적이기 때문이다. 따라서, 속성 값이 아닌 속성 자체의 특성을 고려하여 함수 종속 관계를 판단해야 한다.
일반적으로, 기본키와 후보키는 릴레이션을 구성하는 다른 모든 속성들을 함수적으로 결정한다. 그러나, 기본키나 후보키만 결정자가 될 수 있는 것은 아니며, 기본키나 후보키가 아니라도 함수 종속 관계에서 결정자가 될 수 있다. 이때, 속성이 기본키의 일부만으로도 결정되는가, 아니면 반드시 기본키 전체가 필요한가에 따라 완전 함수 종속과 부분 함수 종속으로 나눌 수 있다.
- `완전 함수 종속(Full Functional Dependency)`: 기본키 전체가 있어야만 속성이 결정되는 경우
- `부분 함수 종속(Partial Functional Dependency)`: 기본키의 일부만 있어도 속성이 결정되는 경우
정규화의 기본 개념 (Normalization)
정규화의 필요성
관련이 없는 속성들을 하나의 릴레이션에 모아두는 경우, 여러 이상 현상이 발생할 수 있다. 이러한 문제를 해결하기 위하여 릴레이션을 구성할 때, 관련 있는 속성들로만 구성해야 한다. 이때, 필요한 과정이 “정규화(Normalization)”이다.
정규화는 이상 현상이 발생하지 않도록 릴레이션을 분해하는 과정이다. 이때, 함수 종속성을 이용하여 릴레이션을 연관성이 있는 속성들로만 구성되도록 분해해야 한다. 이러한 과정을 통해 이상 현상이 발생하지 않는 올바른 릴레이션을 만들 수 있다.
정규형 종류
릴레이션이 정규화된 정도는 정규형(Normal Form)으로 표현하는데, 정규형은 제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형 제4정규형, 제5정규형으로 나뉜다. 각 정규형마다 만족시켜야 하는 제약조건이 존재하며, 릴레이션이 특정 정규형의 제약조건을 만족하면 해당 정규형에 속하게 된다. 정규형의 차수가 높아질수록 요구되는 제약조건도 많아지고 엄격해진다.
정규형의 차수가 높을수록 이상 현상이 발생할 가능성이 적은 설계가 잘된 릴레이션이지만, 모든 릴레이션이 제5정규형에 속할 필요는 없기에 릴레이션의 특성을 잘 고려하여 적합한 정규형을 선택해야 한다.
제1정규형 (1NF)
제1정규형은 릴레이션에 속한 모든 속성의 도메인이 원자 값으로만 구성되어 있어야 한다.
원자 값이란 속성이 더 이상 분해되지 않는 상태를 말하며, 다중 값을 가지는 속성을 포함하는 릴레이션은 제약조건을 만족하지 못하기에 제1정규형에 속하지 못한다.
제1정규형을 만족해야 관계형 데이터베이스의 릴레이션이 될 자격이 생긴다. 그러나 제1정규형에는 속하더라도 불필요한 데이터 중복으로 인해 이상 현상이 발생할 수 있다.
제2정규형 (2NF)
제2정규형은 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되어야 한다.
즉, 부분 함수 종속이 모두 제거되고 모든 속성이 기본키에 완전 함수 종속되도록 하는 정규화 과정을 거치면 제2정규형이 될 수 있다.
정규화 과정에서 릴레이션을 분해할 때, 분해된 릴레이션들은 자연 조인하여 분해 전의 릴레이션으로 다시 복원될 수 있어야 한다. 이를 무손실 분해라고 하며, 정규화 과정에서 수행되는 릴레이션의 분해는 무손실 분해여야 한다. 부분 함수 종속은 없더라도 함수 종속성을 여러 개 포함한다면 제2정규형에 속하더라도 릴레이션에 이상 현상이 발생할 수 있다.
제3정규형 (3NF)
제3정규형은 릴레이션이 제2정규형에 속하고, 기본키가 아닌 모든 속성이 이행적 함수 종속이 되지 않아야 한다.
릴레이션을 구성하는 3개의 속성 집합 $X, \ Y, \ Z$에 함수 종속 관계 $X \rightarrow Y$와 $Y \rightarrow Z$가 존재하면 논리적으로 $X \rightarrow Z$가 성립하는데 이를 이행적 함수 종속이라고 한다.
제2정규형을 만족하더라도 하나의 릴레이션에 여러 개의 함수 종속 관계가 존재하고 이행적 함수 종속 관계가 유도되면 이상 현상이 발생할 수 있다. 따라서 이행적 함수 종속을 제거하는 정규화 과정을 거쳐야 제3정규형이 될 수 있다.
제3정규형에 속하더라도 후보키가 여러 개의 후보키가 존재하는 경우, 이상 현상은 발생할 수 있다.
보이스/코드 정규형(BCNF)
보이스/코드 정규형은 릴레이션의 함수 종속 관계에서 모든 결정자가 후보키여야 한다.
이때 보이스/코드 정규형에 속하는 모든 릴레이션은 제3정규형에 속하지만, 제3정규형에 속하는 릴레이션이라고 해서 모두 보이스/코드 정규형에 속하는 것은 아니다. 모든 결정자가 후보키가 되도록 테이블을 무손실 분해하면 BCNF 정규형이 될 수 있다.
제4정규형과 제5정규형
제4정규형은 릴레이션이 보이스/코드 정규형(BCNF)에 속하고, 함수 종속이 아닌 다치 종속을 제거해야 한다.
제5정규형은 릴레이션이 제4정규형에 속하고, 후보키를 통하지 않는 조인 종속을 제거해야 한다.
데이터베이스를 설계할 때, 릴레이션이 반드시 제5정규형에 속하도록 분해하는 것은 비효율적인 경우가 많다. 일반적으로 제3정규형 또는 BCNF 정규형에 속하도록 릴레이션을 분해하여 데이터 중복을 줄이고 이상 현상 문제를 해결한다.