관계형 데이터베이스 정규화

RDB

관계형 데이터베이스의 정규화에 대해 알아본다.

관계형 데이터베이스의 주요 개념들을 다루는 이전 포스트를 먼저 읽는 것을 권장한다.

정규화는 데이터를 완전히 이해하는 과정이다.

목적

정규화의 목적은 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정규형

모든 속성은 반드시 하나의 값(원자값)을 가져야 한다.

관련된 속성은 다가 속성, 복합 속성, 반복 속성이다.

복합 속성의 예로는 주소, 날짜, 계좌번호가 있다. 복합 속성은 구분해야 할 요건(information requirement)이 있을 때 분해하는 것이 좋다.

가장 이상적인 구조는 동일한 성격의 속성이 여러 테이블에 존재하는 것이 아닌, 하나만 존재하는 것이다.

2정규형

테이블의 모든 속성이 후보 식별자 전체에 종속적이어야 한다.

부분적인 함수 종속을 제거해야 한다.

다음은 2정규형을 위반하는 모델이다.

#주문번호#상품번호상품명단가주문수량
1234P0001오라클 아키텍처100002
1234A0001데이터 모델링이란150001
1235P0001오라클 아키텍처100001

상품번호가 상품명과 단가를 결정한다. 상품명과 단가가 후보 식별자 일부에 종속적이다. 상품 엔터티를 분리할 필요가 있다.

3정규형

일반 속성 간에 종속이 없어야 한다.

이행적(transitive) 종속성은 X → Y이고 Y → Z이면 X → Z라는 것을 의미한다. 3정규형에는 이행적 종속성이 없어야 한다.

다음은 3정규형을 위반하는 모델이다.

#주문번호고객ID고객명주문일자배송요청일자
1234blues홍길동2027-10-102027-10-13
1235pupils김길동2028-01-012028-01-03
1236blues홍길동2027-12-152027-12-16

고객ID가 고객명을 결정한다. 고객ID와 고객명을 별도의 모델로 분리해야 한다.

보이스코드 정규형

모든 결정자는 주 식별자이어야 한다.

3정규형의 엄격한 버전이다. 3정규형과의 차이점은 Y가 후보 식별자라는 점이다.

다음은 BC정규형을 위반하는 모델이다.

#학생번호#과목명교수번호학점
S124수학P987A
S124물리학P654B
S568물리학P654B

교수번호가 과목명을 결정한다. 교수번호와 과목명을 별도의 모델로 분리해야 한다.

4정규형

4정규형은 다가 종속에 기반한다.

독립적인 일대다 관계의 속성이 하나의 테이블에 존재하면 다가 종속(multivalued dependency, MVD)이 발생한다.

#사원#기술#언어
홍길동모델링영어
홍길동모델링한국어
홍길동튜닝영어
홍길동튜닝한국어

기술과 언어는 서로 직접적인 관련이 없다. 사원-기술 모델과 사원-언어 모델로 분리할 필요가 있다.

5정규형

5정규형은 조인 종속에 기반한다.

테이블을 분해하고 다시 합쳤을 때 원래의 테이블로 복원할 수 있으면, 조인 종속이 존재하는 테이블이다. 위 모델에서 기술과 언어가 관련이 있는 것이 조인 종속이 있는 모델이다. 5정규형에서는 조인 종속이 있는 모델을 분리해야 한다.

실무에서는 5정규형은 적용하는 것이 안 좋을 때가 많다. 하지만 5정규형이 어떤 모델인지 알아야 적용하지 않을 수가 있다.

정리

여기서 다룬 정규형을 정리하면 다음과 같다.

구분제거 대상특징
1정규형다가 속성, 복합 속성, 반복 속성, 중첩 테이블 제거속성이 추가되거나, 일대다 관계의 테이블이 추가되며 관계를 상속시킴
2정규형부분 종속 제거일대다 관계의 테이블이 추가되며 관계를 상속받음
3정규형이행 종속 제거일대다 관계의 테이블이 추가되며 관계를 상속받음
BC정규형종속자가 키에 포함된 함수 종속 제거모든 결정자는 키이어야 한다는 관점에서 3정규형과 동일
4정규형다가 종속 제거다가 속성의 개수만큼 일대다 관계의 테이블이 추가됨
5정규형조인 종속 제거조인 종속이 존재하는 테이블이 사용하기 편함. 지나치게 이상적인 정규형

성능

정규화를 하면 성능이 나빠진다는 것은 널리 알려진 잘못된 상식이다.

흔히 말하는 성능에는 크게 두 가지 종류가 있다. 조회 성능과 삽입 성능이다. 삽입 성능은 금융과 같은 일부 분야에서만 문제가 된다.

조회 성능도 소수 데이터(상세)를 조회하는 것과 다량의 데이터(목록)를 조회하는 것으로 나눌 수 있다.

대부분의 DBMS는 데이터를 블록 단위로 읽는다. 정규화를 하면 인스턴스의 크기가 작아지고 한 블록에 들어가는 인스턴스는 많아진다. 관련 있는 데이터가 한 블록에 있을 확률이 올라가 적중률(hit ratio)이 높아진다. 정규화가 오히려 성능을 좋게 만들 수 있다.

성능 문제에 대한 고려는 정규화 이후에 진행되어야 한다. 비정규형을 먼저 사용하고 나중에 정규화를 고려하는 방법은 잘못된 접근이다. 정규형에서 비정규형은 쉽지만, 비정규형에서 정규형은 어렵다.

관계형 데이터 모델링 프리미엄 가이드 개정판 - 김기창