DB 정규화(normalization)
- 데이터 중복과 insertion, update, deletion anomaly를 최소화하기 위해 일련의 normal forms(NF)에 따라 relational DB를 구성하는 과정
- NF : 정규화 되기 위해 준수해야 하는 몇 가지 rule
정규화 과정
- 처음부터 순차적으로 진행하며 normal form을 만족하지 못하면 만족하도록 테이블 구조를 조정한다.
- 앞 단계를 만족해야 다음 단계로 진행할 수 있다.
- 1NF ~ BCNF : FD와 key만으로 정의되는 normal form
- 3NF까지 도달하면 정규화 됐다고 말하기도 함
- 보통 실무에서 3NF 혹은 BCNF까지 진행(많이 해도 4NF)
예시 스키마
{bank_name, account_num, account_id, class, ratio, empl_id, empl_name, card_id}
- 임직원의 월급 계좌를 관리하는 테이블
- 월급 계좌는 국민은행이나 우리은행 중 하나
- 한 임직원이 하나 이상의 월급 계좌를 등록하고 월급 비율(ratio)를 조정할 수 있다.
- 각 계좌마다 등급(class)가 있다.
- 한 계좌는 하나 이상의 현급 카드와 연동될 수 있다.
- 위와 같은 스키마를 순차적으로 정규화 하면서 설명하겠다.
key 설정
- candidate key : {account_id} 혹은 {back_name, account_name}이다.
- Primary key :
{account_id}
- prime attribute :
account_id, account_num, bank_name
(임의의 key에 속하는 attribute) - non-prime attribute :
class, ratio, empl_id, empl_name, card_id
1NF
- Attribute의 value는 반드시 나눠질 수 없는 단일한 값이어야 한다.
2NF
- 모든 non-prime attribute는 모든 key에 fully functionally dependent 해야 한다.
- 2NF는 key가 composite key가 아니라면 2NF는 자동적으로 만족한다(일반적으로 맞는 말이긴하지만 일반적으론 아니다)
3NF
- 모든 non-prime attribute는 어떤 key에도 transitively dependent하면 안된다.
- non-prime attribute와 non-prime attribute 사이에는 FD가 있으면 안된다.
BCNF
- 모든 유효한 non-trivial FD X->Y는 X가 user key여야 한다.
Denormalization
- 의도적으로 정규화 단계를 해지하고 table을 합치는 것
- 복잡도와 성능 문제로 인해 역정규화를 하는 경우가 존재한다.