관계형 데이터 모델링에서 정규화(Normalization)는 속성(컬럼)간의 종속성을 없애는 것을 의미합니다.
데이터의 성격에 맞는 데이터 구조는 견고하고 확장성이 뛰어나며 데이터의 무결성이 높아집니다.
속성은 반드시 하나의 값을 가져야 한다.
학번 | 학생 이름 | 전화 번호 | 취미 |
---|---|---|---|
123 | 김태하 | 010-1234-5678 | 넷플릭스 감상, 독서 |
456 | 김태영 | 010-5678-1234 | 컴퓨터 게임, 유튜브 인기 영상 시청 |
위의 표는 정규형을 위반한 릴레이션입니다.
취미라는 속성에는 하나의 값만 들어가야 하는데 ,(콤마)
로 여러개의 값이 하나의 속성에 들어있는것을 볼 수있습니다.
이럴 경우 다음과 같이 제 1 정규형를 해줍니다.
#학번 | 학생 이름 | 전화 번호 |
---|---|---|
123 | 김태하 | 010-1234-5678 |
456 | 김태영 | 010-5678-1234 |
#학번 | 취미 |
---|---|
123 | 넷플릭스 감상 |
123 | 독서 |
456 | 컴퓨터 게임, |
456 | 유튜브 인기 영상 시청 |
부분 종속성을 제거한다.
2정규형은 릴레이션의 모든 속성이 후보 식별자 전체에 종속적이면 2정규형이며,
후보 식별자 전체가 아닌 부분적으로 종속하면 2정규형을 만족하지 않는다.
#주문번호 | #상품번호 | 상품명 | 가격 | 주문수량 |
---|---|---|---|---|
123 | P0001 | 데이터모델링 | 10000 | 2 |
123 | A0001 | AWS 기본 | 20000 | 1 |
456 | B0001 | 파이썬 자료구조 | 30000 | 1 |
456 | C0001 | 플라스크 | 25000 | 1 |
456 | A0001 | 장고 | 20000 | 2 |
위의 경우 일반속성인 상품명과 단가는 주 식별자 전체(주문번호, 상품번호)에 종속되지 않고 상품번호에만 종속되어 있습니다.
따라서 2정규형을 만족하지 않기 때문에 상품명과 단가를 기존의 엔티티에서 제외하고 상품번호를 주 식별자로 하는 새로운 엔티티를 만들어 줍니다.
#상품번호 | 상품명 | 가격 |
---|---|---|
P1 | 데이터모델링 | 10000 |
A1 | AWS 기본 | 20000 |
B1 | 파이썬 자료구조 | 30000 |
C1 | 플라스크 | 25000 |
#주문번호 | #상품번호 | 주문수량 |
---|---|---|
123 | P1 | 2 |
123 | A1 | 1 |
456 | B1 | 1 |
456 | C1 | 1 |
456 | A1 | 2 |
이행 종속성을 제거한다.
일반 속성간에도 종속관계가 있을수 있는데 이런 관계를 이행 종속성이라 하며, 이행 종속성을 제거하면 3 정규형을 만족합니다.
간단히 말해서 기본키인 주 식별자말고는 다른 컬럼이 그외의 컬럼을 결정 할 수 없어야 합니다.
#주문번호 | #회원ID | 회원명 | 주문일 | 배송일 |
---|---|---|---|---|
123 | user1 | 김태하 | 2020-09-20 | 2020-09-22 |
456 | user2 | 김태영 | 2020-10-02 | 2020-10-04 |
789 | user1 | 김태하 | 2020-09-27 | 2020-09-29 |
위의 예에서는 주문번호로 회원명을 알 수 있고, 회원ID로도 회원명을 알 수 있습니다.
따라서 3 정규형을 만족시키게 하려면 다음과 같이 엔티티를 나눠 줍니다.
#회원ID | 회원명 |
---|---|
user1 | 김태하 |
user2 | 김태영 |
#주문번호 | #회원ID | 주문일 | 배송일 |
---|---|---|---|
123 | user1 | 2020-09-20 | 2020-09-22 |
456 | user2 | 2020-10-02 | 2020-10-04 |
789 | user1 | 2020-09-27 | 2020-09-29 |