최소한의 데이터 중복을 가지고, 유저들이 anomaly를 발생시키지 않고 insert(삽입), delete(삭제), modify(수정)을 할 수 있게 해주는 relation을 의미한다.
Anomaly를 피하는 것이 가장 큰 목적이다. Anomaly에는 아래의 3가지가 존재한다.
최고의 방법은 하나의 테이블이 둘 이상의 entity type의 형태로 존재하면 안되게 해야하는 것이다.
데이터베이스 이론 중에서 중요한 개념 중 하나인 normalization이다. 위에서 언급한 3가지 anomaly를 피하기 위해서는 well structured relation이 필요하게 되는데 이를 위해 하는 작업이 normalization이다. 또한, logical database design을 평가하거나 향상시키기 위한 도구로 사용된다.
보다 작고 잘 구성된 relation(well structured relation)들을 생성하기 위해, anomaly를 가지고 있는 relation을 분해하는 과정을 Normalization이라고 한다.
Normalization의 주된 목적은 다음과 같다.
함수와 같이 어떤 값을 통해 종속된 관계에 있는 다른 값을 유일하게 결정할 수 있다는 것을 의미한다.
한 relation에 하나 혹은 그 이상의 attribute로 이루어진 집합인 X와 Y가 있다고 하자. 그리고 X와 Y 사이에는 교집합이 존재하지 않는다고 하자.
X에 포함되는 각각의 값들에 대해 Y로에 unique한 값들이 존재하는 것을 funtional dependency라고 한다. 이 경우 X가 Y를 결정한다고 하며, X→Y로 표현한다.
또한, X→Y 형태의 functional dependency에서 X에 포함되는 attribute들의 집합은 X→Y 형태의 functional dependency의 determinant라고 부른다.
예를 들어, 한 relation에 age와 birthday를 attribute로 갖는다고 해보자. age는 birthday에 종속되어 있다고 볼 수 있으며, 이 경우 age는 birthday를 통해 age를 알아낼 수 있기에, age가 없더라도 결정이 가능한 attribute이다.
Well structured relation을 만들 때 functional dependency를 찾으면, 중복되는 데이터를 없앨 수 있다. 그렇기에 Normalization을 하는 단계에서 functional dependency를 찾는 것은 매우 중요한 일이다.
또한, Functional dependency는 다음과 같이 2가지로 나눌 수 있다.(X→Y)
어떤 특정한 규칙의 적용으로 나오게 되는 relaion의 상태(state)를 말한다. 혹은 Normalization의 과정은 보통 단계별로 진행되는데, 각각의 단계에 대응하는 것을 의미하기도 한다.
Normalization의 과정에서, relation은 다음의 상태에 놓여있을 것이다. 또한, 이러한 모든 normal form들은 relation의 attribute들의 functional dependency를 기반으로 하고 있다.
일반적으로 well structured relation은 3NF까지 된 경우를 의미하며, 그 이상의 더 높은 단계도 존재하게 된다.
이러한 normal form들은 매우 드물게 상황에 따라 적용하기도 한다.
하나의 relation 내의 모든 attribute는 mulitivalued가 아니며, composite이 아니여야 한다.
모든 relation들은 1NF의 상태에 있다. Relation의 속성 중 하나가 mulitivalued가 아니며, composite이 아닌 것이기 때문이다.
Relation이 2NF이기 위해서는 1NF여야 하며, 모든 primary key가 아닌 attribute들은 primary key에 full functional dependent여야 한다.
2NF의 주된 목적은 Partial functional dependency들을 없애는 것이다. 혹은, primary key가 아닌 attribute들은 primary key의 일부에 의존하고 있어야 한다.
3NF도 2NF와 같이 2NF여야 한다.
Transitive Functional Dependency를 제거하는 것이 주된 목표이다.
예를 들어, A→B이며 B→C이고 A→C인 상황을 transitive functional dependency라고 한다. 이러한 경우, C는 A에 대해 transitively dependent 중이라고 한다.
예를 들어, Course(CourseNo, RoomNo, Capacity)라는 relation이 존재하며, CourseNo→RoomNo, RoomNo→Capacity, CourseNo→Capacity인 functional dependency를 갖는다고 하자.
위의 예시의 경우, Primary key에 직접적으로 의존하고 있는 RoomNo와 RoomNo, CourseNo에 동시에 의존 중인 Capacity 둘을 가지고 따로 relation을 만든다. 이 경우 Capacity는 RoomNo에 의존 중이기 때문에 새로운 relation은 RoomNo을 primary key로 하고 있어야 한다. 3NF 진행 후 relation은 다음과 같아진다.
- Course(CourseNo, RoomNo)
- CourseRoom(RoomNo, Capacity)
3NF까지만 해도 Well structured relation이기 때문에, 여기서는 3NF까지만 다루도록 한다. 필요한 경우에는 4NF와 5NF는 하단의 참고 링크를 통해 공부해보자.
또한, 예시가 부실한 기분이 들어 나중에 시간이 나면 예시를 포함해보도록 하겠다.
https://en.wikipedia.org/wiki/Fourth_normal_form
https://en.wikipedia.org/wiki/Fifth_normal_form