💡정규화
정규화(Nomalization)는 자료의 손실이나 불필요한 정보를 없애고, 데이터의 일관성을 유지하며, 데이터의 종속성을 최소화해 주기 위해 ERD를 수정하는 작업이다.
쉽게 말해 모델링 작업을 하면서 만들어진 ERD를 올바르게 했는지 검증하는 작업이다.
정규화를 하면 ERD의 안정성이 높아지고, 작업하기 편하게 바뀐다.
최종적으로 정규화는 '부분 함수 종속'이나 '이행 함수 종속'을 모두 제거하고, 모든 컬럼의 관계를 '완전 함수 종속'으로 만드는 작업이다.
정규화의 상태
우리가 만든 테이블(ERD)를 비정형 상태 또는 비 정규화 상태라고 말한다. 이를 정규화 과정을 통해 올바르게 수정하고 고치고 나면 정규화 상태라고 한다.
대부분의 개발자들은 만들 때부터 정규화를 하면서 만든다.
정규화의 종류
제1 정규화, 제2 정규화, 제3 정규화 등이 있으며, 대부분 제3 정규화까지만 하는 편이다.
편의상 번호를 붙여놓았을 뿐, 정규화의 순서에는 의미가 없다.
정규화 목적
1. null 최대한 제거
2. 중복값 제거
3. 복합값 제거
4. 자료의 삽입 이상, 갱신 이상, 삭제 이상 현상 제거
RDBMS가 지양하는 것에 대해서는 위 글을 참고하도록 하자.
이상 현상
이상 현상은 테이블을 잘못 설계했을 때 발생하는 현상이다.
정규화를 거치면 이상 현상이 모두 사라진다.
1. 삽입 이상 (Insertion Anomaly)
특정 테이블에 데이터를 삽입할 때 원하지 않는 데이터까지 같이 넣어야 하는 상황
2. 갱신 이상 (Update Anomaly)
동일한 데이터가 2개 이상의 테이블에 동시 저장되는 상황
동일한 데이터 중 1개는 수정했지만, 다른 1개를 수정하지 못하면 둘 중 어느 것이 올바른 데이터인지 판단하지 못하는 상황이 생긴다.
3. 삭제 이상 (Deletion Anomaly)
특정 테이블에서 데이터를 삭제할 때 원하지 않는 데이터까지 같이 삭제하는 상황
함수 종속
- 완전 함수 종속
- 부분 함수 종속
- 이행 함수 종속
함수 종속(Functional Dependency)은 하나의 테이블 내에서 컬럼끼리의 관계를 표현한 것이다.
💡제1 정규화 (1NF)
제1 정규화는 모든 컬럼(속성)이 원자값을 가지게 하는 작업이다.
여러 개의 분리 가능한 값을 1개의 컬럼 안에 넣지 않아야 한다.
NF는 Normal Form으로 정규화의 약자이다.
제1 정규화 대상
과목명과 성적 컬럼에 여러 개의 데이터(복합값)가 들어가 있다.
이런 테이블이 제 1 정규화의 대상이다.
제1 정규화 적용
과목과 성적마다 레코드를 분리시켜 원자값을 가지게 함으로써 제1 정규화를 지킬 수 있다.
하지만 학번과 학생명이 중복되는 문제가 발생한다.
지금까지는 학번이 PK였다. 하지만 이젠 학번이 반복되므로 PK가 될 수 없다.
그래서 실제로는 위와 같은 방법을 더 많이 사용한다.
문제가 되는 데이터를 가지고 다른 테이블을 하나 더 만들어 분리한다.
원본 테이블과 분리된 테이블과의 참조 관계를 만들어 외래키를 만들고, 분리된 테이블에 새로운 기본키를 만들어 주어야 한다.
제1 정규화는 1개 테이블이 정규화를 거친 뒤에 2개 이상의 테이블이 된다는 특징이 있다.
💡제 2 정규화 (2NF)
기본 키가 아닌 모든 컬럼은 기본키에 완전 함수 종속이어야 한다.
제2 정규화는 부분 함수 종속을 발견하여 부분 함수 종속을 제거하는 작업이다.
복합키를 가지는 테이블에서만 발견된다.
제2 정규화 대상
한 번의 학생이 단 한 개의 과목만 수정할 수 있다는 가정 하에 학번과 과목명을 묶어 기본키로 만들었고, 복합키가 생성되었다.
부분 함수 종속은 기본키가 아닌 다른 컬럼이 기본키가 아닌 다른 속성에 종속되거나, 기본키가 여러 속성으로 구성되어 있을 경우, 기본키를 구성하는 속성 중 일부만 종속되는 경우를 말한다.
완전 함수 종속은 기본키가 아닌 나머지 컬럼이 기본키에 종속적인 상태임을 의미하며, 부분 함수 종속을 해결하여 완전 함수 종속을 유지할 수 있도록 해야 한다.
제2 정규화 적용
새로 만든 테이블에 가상의 기본키를 만든다. 이때 일련번호로 1, 2, 3, 4, 5를 넣는 대신에 학번으로 대체할 수 있기 때문에 학번을 기본키로 설정하였다.
이처럼 복합키를 사용할 대 기본키가 아닌 나머지 컬럼이 반드시 종속적이게 하여 부분 함수 종속을 제거해야 한다.
💡제 3 정규화 (3NF)
제3 정규화는 제2 정규화와 마찬가지로 기본키가 아닌 모든 컬럼은 기본키에 완전 함수 종속이어야 한다.
제3 정규화는 이행 함수 종속을 발견하고, 이행 함수 종속을 제거하는 작업이다.
제3 정규화 대상
제2 정규화에서 기본키가 아닌 나머지의 컬럼이 기본키에 종속되어야 한다고 했다.
이행 함수 종속은 나머지의 컬럼이 기본키가 아닌 다른 컬럼에 종속되는 것을 말한다.
제3 정규화 적용
현재 학과가 기본키가 아닌 학과사무실을 종속하고 있다.
새로운 테이블에 등록금과 학과사무실 컬럼으로 분리하고 가상의 기본키를 만든다.
그리고 원본 테이블은 학생명과 학과 컬럼에 학번을 기본키로, 학과번호로 FK를 만들어 종속한다.
기본키의 성질 중에 하나가 유일성을 보장해야 하며, 웬만하면 수정하지 않아야 된다고 했다.
그런데 학과(부모.PK) 이름은 변할 수 있는 데이터이다. 그리고 학과(부모.PK)가 변하면 학과(자식.FK)가 변하게 된다.
이런 문제를 해결하기 위해서 학과번호를 만들어 학과가 아닌 학과번호를 기본키로 설정할 수 있다.
💡역정규화
역정규화는 정규화된 결과를 다시 원래대로 되돌리는 작업이다.
2개 이상의 테이블을 역정규화 하면 1개의 테이블이 된다.
하나의 테이블을 정규화하면서 쪼개서 조인하면 쪼개기 전의 테이블을 조인하게 된다.
쪼개 놓은 것을 검사해서 가져오기 때문에 조인을 할 때 비용이 비싸지게 되므로, 이와 관련한 select 작업을 많이 한다면 정규화하기 전의 상태가 더 나을 수 있다.