관계형 데이터베이스 정규화
관계형 데이터베이스의 정규화에 대해 알아본다.
관계형 데이터베이스의 주요 개념들을 다루는 이전 포스트를 먼저 읽는 것을 권장한다.
정규화는 데이터를 완전히 이해하는 과정이다.
목적
정규화의 목적은 DB의 안정성과 확장성이다. 정규화를 하는 가장 근본적인 이유는 중복 데이터 제거이다.
비정규형과 정규형
비정규형(Non-Normal Form)의 특징은 다음과 같다.
- 업무 요건의 변경에 취약하다. 확장성이 좋지 않다.
- 인덱스 수가 증가한다.
- 속성 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 없다.
- 엔터티의 속성이 추가될 가능성이 없을 때 사용 가능하다.
정규형(Normal Form)의 특징은 다음과 같다.
- 업무 요건의 변경에 유연하다. 확장성이 좋다.
- 인덱스 수가 감소한다.
- 속성 레벨로 관리되는 데이터의 자식 엔터티를 가질 수 있다.
- 엔터티의 속성이 추가될 가능성이 존재할 때 사용한다.
아노말리
아노말리(anomaly)는 데이터의 이상 현상이다.
아노말리의 종류는 다음과 같다.
- 업데이트 아노말리: 일부 데이터가 업데이트되지 않음
- 삭제 아노말리: 의도하지 않은 데이터가 같이 삭제됨
- 삽입 아노말리: 일부 속성 때문에 삽입이 불가능함
정규형 모델에서는 아노말리가 최소화된다.
정규형
정규형의 종류는 1정규형(First Normal Form, 1NF), 2정규형, 3정규형, 보이스코드 정규형(Boyce-Codd Normal Form, BCNF, 3.5NF), 4정규형, 5정규형 등이 있다.
1정규형, 2정규형, 3정규형이 정규화 대상의 대부분을 차지한다. 하지만 다른 정규형도 알고 있을 필요가 있다.
1정규형
모든 속성은 반드시 하나의 값(원자값)을 가져야 한다.
관련된 속성은 다가 속성, 복합 속성, 반복 속성이다.
- 다가 속성(multivalued attributes): 같은 종류의 값을 여러 개 가지는 속성
- 복합 속성(composite attrubutes): 여러 개의 속성으로 분리될 수 있는 속성
- 반복 속성: (전화번호1, 전화번호2, 전화번호3)과 같이 반복되는 속성
복합 속성의 예로는 주소, 날짜, 계좌번호가 있다. 복합 속성은 구분해야 할 요건(information requirement)이 있을 때 분해하는 것이 좋다.
가장 이상적인 구조는 동일한 성격의 속성이 여러 테이블에 존재하는 것이 아닌, 하나만 존재하는 것이다.
2정규형
테이블의 모든 속성이 후보 식별자 전체에 종속적이어야 한다.
부분적인 함수 종속을 제거해야 한다.
다음은 2정규형을 위반하는 모델이다.
#주문번호 | #상품번호 | 상품명 | 단가 | 주문수량 |
---|---|---|---|---|
1234 | P0001 | 오라클 아키텍처 | 10000 | 2 |
1234 | A0001 | 데이터 모델링이란 | 15000 | 1 |
1235 | P0001 | 오라클 아키텍처 | 10000 | 1 |
상품번호가 상품명과 단가를 결정한다. 상품명과 단가가 후보 식별자 일부에 종속적이다. 상품 엔터티를 분리할 필요가 있다.
3정규형
일반 속성 간에 종속이 없어야 한다.
이행적(transitive) 종속성은 X → Y
이고 Y → Z
이면 X → Z
라는 것을 의미한다. 3정규형에는 이행적 종속성이 없어야 한다.
다음은 3정규형을 위반하는 모델이다.
#주문번호 | 고객ID | 고객명 | 주문일자 | 배송요청일자 |
---|---|---|---|---|
1234 | blues | 홍길동 | 2027-10-10 | 2027-10-13 |
1235 | pupils | 김길동 | 2028-01-01 | 2028-01-03 |
1236 | blues | 홍길동 | 2027-12-15 | 2027-12-16 |
고객ID가 고객명을 결정한다. 고객ID와 고객명을 별도의 모델로 분리해야 한다.
보이스코드 정규형
모든 결정자는 주 식별자이어야 한다.
3정규형의 엄격한 버전이다. 3정규형과의 차이점은 Y
가 후보 식별자라는 점이다.
다음은 BC정규형을 위반하는 모델이다.
#학생번호 | #과목명 | 교수번호 | 학점 |
---|---|---|---|
S124 | 수학 | P987 | A |
S124 | 물리학 | P654 | B |
S568 | 물리학 | P654 | B |
교수번호가 과목명을 결정한다. 교수번호와 과목명을 별도의 모델로 분리해야 한다.
4정규형
4정규형은 다가 종속에 기반한다.
독립적인 일대다 관계의 속성이 하나의 테이블에 존재하면 다가 종속(multivalued dependency, MVD)이 발생한다.
#사원 | #기술 | #언어 |
---|---|---|
홍길동 | 모델링 | 영어 |
홍길동 | 모델링 | 한국어 |
홍길동 | 튜닝 | 영어 |
홍길동 | 튜닝 | 한국어 |
기술과 언어는 서로 직접적인 관련이 없다. 사원-기술 모델과 사원-언어 모델로 분리할 필요가 있다.
5정규형
5정규형은 조인 종속에 기반한다.
테이블을 분해하고 다시 합쳤을 때 원래의 테이블로 복원할 수 있으면, 조인 종속이 존재하는 테이블이다. 위 모델에서 기술과 언어가 관련이 있는 것이 조인 종속이 있는 모델이다. 5정규형에서는 조인 종속이 있는 모델을 분리해야 한다.
실무에서는 5정규형은 적용하는 것이 안 좋을 때가 많다. 하지만 5정규형이 어떤 모델인지 알아야 적용하지 않을 수가 있다.
정리
여기서 다룬 정규형을 정리하면 다음과 같다.
구분 | 제거 대상 | 특징 |
---|---|---|
1정규형 | 다가 속성, 복합 속성, 반복 속성, 중첩 테이블 제거 | 속성이 추가되거나, 일대다 관계의 테이블이 추가되며 관계를 상속시킴 |
2정규형 | 부분 종속 제거 | 일대다 관계의 테이블이 추가되며 관계를 상속받음 |
3정규형 | 이행 종속 제거 | 일대다 관계의 테이블이 추가되며 관계를 상속받음 |
BC정규형 | 종속자가 키에 포함된 함수 종속 제거 | 모든 결정자는 키이어야 한다는 관점에서 3정규형과 동일 |
4정규형 | 다가 종속 제거 | 다가 속성의 개수만큼 일대다 관계의 테이블이 추가됨 |
5정규형 | 조인 종속 제거 | 조인 종속이 존재하는 테이블이 사용하기 편함. 지나치게 이상적인 정규형 |
성능
정규화를 하면 성능이 나빠진다는 것은 널리 알려진 잘못된 상식이다.
흔히 말하는 성능에는 크게 두 가지 종류가 있다. 조회 성능과 삽입 성능이다. 삽입 성능은 금융과 같은 일부 분야에서만 문제가 된다.
조회 성능도 소수 데이터(상세)를 조회하는 것과 다량의 데이터(목록)를 조회하는 것으로 나눌 수 있다.
대부분의 DBMS는 데이터를 블록 단위로 읽는다. 정규화를 하면 인스턴스의 크기가 작아지고 한 블록에 들어가는 인스턴스는 많아진다. 관련 있는 데이터가 한 블록에 있을 확률이 올라가 적중률(hit ratio)이 높아진다. 정규화가 오히려 성능을 좋게 만들 수 있다.
성능 문제에 대한 고려는 정규화 이후에 진행되어야 한다. 비정규형을 먼저 사용하고 나중에 정규화를 고려하는 방법은 잘못된 접근이다. 정규형에서 비정규형은 쉽지만, 비정규형에서 정규형은 어렵다.
관계형 데이터 모델링 프리미엄 가이드 개정판 - 김기창