데이터 모델링 강의 중 이해가 가장 어려운 부분이 있습니다. 바로 정규화입니다. 사실 듣고 있으면 이해는 되는데요. 금방 잊어버린다는 사실이죠. 이 글에서는 쉬운 예시로 정규화를 접근 해 보도록 하겠습니다.
정규화는 1~5정규화, 그리고 BCNF까지 있습니다. 다 알려고 하면 머리만 복잡합니다. 가장 많이 사용되는 1, 2, 3정규형까지만 확실히 알아놓자고요. 사실 3정규형까지만 알아도 모델링하는데 아무 문제가 되지 않습니다.
정규화 과정과 원칙
실제 모델링을 할 때 정규화 과정을 Task로 만들지는 않습니다. 대부분 논리 모델링을 할 때 정규화에 맞게 모델러들이 알아서 설계합니다. 그리고 물리 모델링 때 반정규화 할 부분을 도출하죠.
예를들어, 모델링 이후 1정규형 → 2정규형 → 3정규형 거치는 방식으로 검토하지 않는다는 말입니다. 인터넷에 떠도는 정규화 과정은 이해를 위해 단계를 나누었다 정도로 생각해 주세요.
실제 모델러들은 정규화가 몸에 배여 있기 때문에 바로바로 하는 식입니다. “이거 2정규형 위배잖아” 이런 말은 신입 모델러를 가르칠때나 나오는 말입니다.
정규화 대 원칙은 첫째, '집합에 맞게 속성을 정의한다' 둘째, '데이터의 중복을 제거한다' 입니다. 데이터를 다루다 보면 집합이라는 말을 많이 합니다. 그 개념은 엔티티에 맞는 속성만 넣어야 한다는 말입니다.
더도 말고 덜도 말고 모든 속성은 자기 자리가 있다는 말인데요. 만약 데이터 중복이 발생하면 자기 엔티티 자리가 아닌 것입니다. 바로 집합의 분리가 필요하다는 신호이죠.
제1정규형(1NF)
모든 컬럼은 원자 값을 가져야 합니다. ’원자‘라는 말은 더 이상 쪼갤 수 없는 가장 작은 단위를 말합니다. 즉, 다중 값을 가질 수 있는 컬럼은 분리되어야 합니다. 예를 들어, 장원영의 구입상품 "아이폰, MacBook"이었다면 아래와 같이 분리해 row로 떨어뜨려야 합니다.
원자 값을 적용하면 반복 그룹이 나타납니다. 정규화를 하면 어떤 열에도 반복 그룹이나 배열이 발생하면 안됩니다.
고객이 상품을 주문한 정보를 저장하는 테이블을 생각해 보겠습니다.
1. 정규화 문제
고객명, 성별 속성에서 원자성을 갖지 않습니다. 예를 들어, 고객명과 성별이 중복해서 나오고 있죠. 이를 1정규형을 위배했다고 합니다. 결과적으로 고객ID를 PK로 만들 수도 없습니다.
2. 정규화 방법
- 반복 그룹 식별 및 제거 : 여러 값이 반복된 속성을 다른 테이블로 분할
- 원자성 보장 : 각 속성이 중복되지 않는지 확인
- PK 추가 : 기본 키를 추가하여 각 행을 고유하게 식별할 수 있는지 확인
제2정규형(2NF)
우선 1정규형을 만족하고, 키가 아닌 모든 속성(Non-Key 속성)은 기본 키(PK)의 일부가 아닌 전체 기본 키에 종속되어야 합니다. 말이 어려울 수 있는데요. PK속성이 아닌 일반속성의 경우 PK에 종속되어야 한다는 이야기입니다. 일부에 종속되면 안되죠.
1. 정규화 문제
기본 키: (고객ID, 구입일자, 상품)의 복합 키입니다.
문제: '상품정가'는 상품의 가격이기 때문에 상품에만 의존하는 속성입니다. 이럴 경우는 상품 테이블을 분리해 줘야 합니다.
2. 정규화 방법
- 부분 종속성 식별 : 키가 아닌 속성이 복합 키의 일부에만 의존하는지 확인
- 별도의 테이블 생성 : 각 부분 종속성에 대해 새 테이블을 생성. 예시와 같이 상품 테이블을 분리해서 생성
- 부분 종속성 제거 : 이제 원본 테이블에 전체 기본 키에 완전히 종속된 속성만 포함되어 있는지 확인
제3정규형(3NF)
2정규형인 모든 속성이 기본 키에 완전히 기능적으로 종속되어야 하고, 키가 아닌 모든 속성(Non-Key 속성)은 일반 속성에 직접 종속되면 안됩니다. 이를 전이적 종속성이라고 합니다.
전이적 종속성 이해
전이적 종속성은 키가 아닌 속성이 기본 키에 직접적으로 의존하지 않고 다른 키가 아닌 속성에 의존할 때 발생합니다. 즉, A가 B에 의존하고 B가 C에 의존하는 경우 전이 종속성을 피하기 위해 A도 C에 직접 의존해야 합니다.
1. 정규화 문제
기본 키 : 고객ID
문제 : 고객명, 성별은 고객ID에 따라 달라지고, 소속사주소는 소속사에 따라 달라집니다. 소속사주소는 고객ID에 간접적으로 종속되므로 이는 전이적 종속성입니다.
2. 정규화 방법
- 전이적 종속성 식별 : 키가 아닌 속성이 다른 키가 아닌 속성에 종속되는지 확인
- 별도의 테이블 생성 : 각 전이적 종속성에 대해 종속 속성을 저장할 새 테이블을 생성. 예시에서는 소속사 테이블이며, 고객 테이블에 소속사ID를 FK 속성으로 추가
- 전이적 종속성 제거 : 이제 원본 테이블에 기본 키에 직접 종속된 속성만 포함되어 있는지 확인
마치며
정규화 개념에 대해서 좀 이해가 되시나요? 외우려고 하지 않아도 됩니다. 모델을 자주 보다 보면 앞에서 제가 말했던 집합에 대한 감이 생기게 됩니다. 만약 데이터베이스에서 정규화를 왜 하는지가 궁금하시다면 링크를 읽어보시기 바랍니다.
'데이터베이스' 카테고리의 다른 글
MySQL 명령어 완벽정리, 누구나 쉽게 따라하기 (0) | 2024.06.27 |
---|---|
Oracle(오라클) vs MySQL: 타입, 문법, SQL 쿼리 구문 차이 (0) | 2024.06.22 |
NULL의 개념, 공백 문자(" "), NA, NaN과 차이점은 뭘까? (0) | 2024.06.19 |
데이터베이스 정규화 목적, 왜 해야할까? (0) | 2024.06.15 |
메가커피 vs 매머드커피 상품 모델링 비교 분석 (1) | 2024.06.14 |