본문 바로가기
Programming/SQL

[SQL] 1,2,3차 정규화 (feat. ERwin Data Modeler)

by 고막고막 2019. 5. 3.

정규화(定規化, Database Normalization)란?

데이터의 중복을 제거하고 컬럼들의 제자리를 찾아주기 위해 테이블을 정해진 규칙에 의거해 규격화 하는 작업을 말한다. 이론 상으로는 1~5차 정규화와 BCNF까지 총 6단계가 존재하지만, 현장에서는 보통 3단계까지를 많이 수행한다. 정규화를 거친 테이블을 각각의 테이블이 하나의 기능만 수행하게 되어서, 향후 업무가 증가하거나 변화해도 최소한의 수정만으로 처리할 수 있게 된다. 

상단의 주문 테이블을 통해 1~3차 정규화를 수행해보자. 여러 기능을 하나의 테이블에 때려 박은 상태이기 때문에 중복 데이터가 많은 것을 확인할 수 있다. 또한 회원정보나 상품정보에 수정이 발생할 시 해당 데이터를 가지고 있는 모든 컬럼에 적용되어야 하는데, 그렇지 못하기 때문에 다른 컬럼에서는 수정·삭제되기 이전의 데이터를 계속 갖고있게 될 것이다.

 

제1차 정규화

제1차 정규화는 같은 성격과 내용의 컬럼이 연속적으로 나타나는 컬럼이 존재할 때, 해당 컬럼을 제거하고 기본테이블의 PK를 추가해 새로운 테이블을 생성하고, 기존의 테이블과 1:N 관계를 형성하는 것이다.

예제에서는 하나의 주문 단위에 여러 상품이 있을 때 주문정보가 계속 중복되기 때문에 주문 테이블과 주문상세 테이블로 분리했다.

 

제2차 정규화

제2정규화는 PK가 여러 키로 구성된 복합키(Composite Primary Key)로 구성된 경우가 2차 정규화의 대상이 되며, 복합키 전체에 의존하지 않고 복합키의 일부분에만 종속되는 속성들이 존재할 경우 (즉, 부분적 함수 종속 관계) 이를 분리하는 것이다.

위에서는 주문상세 테이블이 자신의 복합키 중 '상품 ID'에는 의존하지 않기 때문에 이를 상품 테이블로 분리할 필요가 있어 제2 정규화를 수행하였다.

 

제3차 정규화

테이블의 키가 아닌 컬럼들은 기본키에 의존해야 하는데 겉으로는 그런 것처럼 보이지만 실제로는 기본키가 아닌 다른 일반 컬럼에 의존하는 컬럼들이 있을 수 있다. 이를 (이전적 함수 종속 관계)라고 한다. 제 3정규화는 PK에 의존하지 않고 일반컬럼에 의존하는 컬럼들을 분리한다.

위의 예제에서는 주문 테이블의 일반 컬럼인 '회원 ID'가 주문 테이블의 PK인 '주문 ID'에 의존하지 않기 때문에 별도의 테이블로 분리할 필요가 있어서 제3 정규화를 수행하였다. 회원 테이블을 생성했으며, 부모인 주문 테이블이 자식인 회원 테이블에 영향을 미치는 관계가 아니기 때문에 두 테이블을 비식별관계로 설정했다.