앞 강좌에 이어서 Normalization 제2, 3단계에 대해 계속 설명드리겠습니다.
참, Normalization을 어떤 사전에서 우리말로 ‘정규화’라고 풀이한 걸 보았습니다. 언뜻 이해가 안되기는 Normalization이나 정규화나 마찬가지네요.
- Second Normalization
First Normalization 과정에서 분리해낸 entity 중 하나를 다시 분리해 내는 과정입니다.
이 과정에서는 Primary Key의 일부와 1:1로 연관된 attribute를 제거합니다.참고로 아래 그림을 보면 분리되기 전의 entity에 PK가 두 개 보이죠. 무슨 말이냐믄요, 주문 번호 하나에 두 개 이상의 상품이 있을 수 있다는 말입니다. 그러니 하나의 occurrence(=한 행, Row, 레코드)를 유일하게 구분해주는 키가 하나의 attribute만으로는 부족하니까 그런 것입니다. 이럴 경우에는 주문 번호와 상품 번호를 함께 묶어서 Primary Key로 설정할 수 있습니다.(이러한 Primary Key 조합을 Composite Key라고 하는데 이후에 설명드리기로 하겠습니다.)
다시 원점으로 돌아와서, 분리되기 전의 entity를 잘 살펴보면(아래 그림에서 노란색 부분과 회색 부분) 상품번호와 상품이름, 가격은 하나의 세트로 만들 수 있겠죠? 즉 101에 해당되는 상품이름은 PCS이고 가격은 120000원이라는 것을 별도의 ‘상품 entity’로 분리해낼 수 있다는 것입니다.

하나의 entity를 다시 두 개로 분리했습니다. 이 과정에서 분리의 기준은 바로 Primary Key였습니다. 다시 말하지만 Primary Key의 일부와 1:1로 연관된 attribute들을 제거하는 과정이 Second Normalization입니다. 위 그림에서 보면 상품 번호라는 PK와 1:1로 연관된 상품 이름, 가격을 별도로 분리해 낸 것입니다. - Third Normalization
Sencond Normalization에서 Primary Key와 연관된 attribute를 제거했습니다.
이번에는 Non-Primary Key들 중에서 1:1 연관 관계가 있는 attribute를 제거하는 Third Normalization에 대해 알아 보겠습니다.아래 그림을 보시죠.
First Normalization 과정에서 분리된 entity입니다. 자세히 보면 고객 번호와 고객명이 1:1 대응관계임을 알 수 있죠. 하나의 고객 번호는 하나의 고객명과 1:1 관계를 맺으니까요.
그럼….. 분리해야죠. 아래와 같이 말입니다.
1,2단계를 이해하셨으면 3단계 Third Normalzation이 한결 쉽게 이해되죠. - Normalized Table
위의 예시로 든 테이블의 경우 1,2,3단계 Normalization 과정을 거치면서 1개의 테이블이 4개로 분리되었습니다.
최종 분리된 테이블들을 나열해 보면 다음과 같습니다.
최초의 혼합된 주문 테이블에서 데이터의 중복을 최소화하여 주문, 고객, 주문항목, 상품 테이블(entity)로 나뉜 것입니다.
- Redrawing ERD
이렇게 Normalization 과정을 거치면 기존의 ERD를 새로 만들어야겠죠.
아래는 새롭게 구성된 ERD입니다.
위 ERD를 말로 풀이해 보면 다음과 같습니다.- 고객과 주문의 관계는 1:M의 관계이면서 주문은 Optional, 고객은 Mandatory입니다.
- 고객(CUSTOMER)은 주문(ORDER)를 여러 개 할 수도 있고 하나도 하지 않을 수 있습니다.
- 주문은 반드시 하나의 고객에 속해야 합니다.
- 주문과 주문항목은 1:M의 관계이면서 주문항목은 Mandatory입니다.
- 주문은 여러 개의 주문항목(ORDER_ITEM)을 가질 수 있되, 주문항목이 없는 주문은 존재하지 않습니다.
- 주문항목 반드시 하나의 주문에 포함되어야 합니다.
- 주문항목과 상품은 M:1의 관계이면서 주문항목은 Optional입니다.
- 하나의 상품(PRODUCT)은 여러 주문항목에 속할 수 있고 한번도 주문되지 않은 상품이 있을 수 있습니다.
- 하나의 주문항목은 반드시 하나의 상품을 가져야 합니다.
- 고객과 주문의 관계는 1:M의 관계이면서 주문은 Optional, 고객은 Mandatory입니다.
ERD를 보면서 위와 같이 표현할 수 있어야 합니다. 데이터 모델링을 하면서 위의 ERD를 읽을 수 없으면 안되죠.
아참, 빠뜨린 게 하나 있네요.
실제 작업을 하다가 보면 부득이하게 데이터의 중복을 최소화하기 위해 Normalization된 데이터를 다시 중복되도록 해야할 경우가 있습니다.
이런 작업을 De-normalization이라고 하는데, 대개의 경우 시스템의 성능 향상을 위해 필요한 경우가 생깁니다.
예를 들어 데이터를 최적화시켰지만 프로그램에서 빈번하게 데이터를 합치게 될 필요가 있을 때 시스템의 성능이 떨어지기 마련이겠죠. 이럴 경우 자주 병합되는 부분을 미리 합쳐놓을 경우가 있습니다. 이를 De-normalization이라고 합니다.
그러나 만약 이러한 De-normalization이 필요하다고 하더라도 처음 Normalization 과정에서 가급적 분리해 놓고 난 다음 필요에 따라 De-normalization을 하는 과정을 거쳐야 합니다. 그렇지 않을 경우에는 데이터를 최적화하는 Normalization 과정에서 최적화되지 않을 수가 있기 때문이죠…
휴일 잘 보내세요.
햇살이 눈부신 일요일 오후 동주아빠 손병목이었습니다.
