1. 제1정규형: 모든 속성은 반드시 하나의 값을 가져야 한다.
- 하나의 속성에는 하나의 값을 가저야 함. 즉, 다중 값을 가져서는 안 된다.
고객번호 | 고객명 | 연락처 |
10000 | 김OO | 02-123-4567, 010-1234-5678 |
위와 같은 엔티티를
고객번호 | 고객명 |
10000 | 김OO |
고객번호 | 순번 | 연락처 |
10000 | 1 | 01-123-4567 |
10000 | 2 | 010-1234-5678 |
위처럼 수정하여 다중값을 제거하면 된다.
-> 다중값 제거
2. 제2정규형: 엔터티의 일반 속성은 주식별자 전체에 종속적이어야 한다.
- 함수 종속성(Functional Dependency)은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭한다.
- 이때, 기존 값을 결정자(Determinent)라고 하고, 종속되는 값을 종속자(Dependent)라고 한다.
아래의 표에서 왼쪽은 주식별자, 오른쪽은 일반속성이라고 하자.
주문번호(FK) & 상품번호 | 상품명 | |
20220901JQB & CHKQ0138 | OO 청소기 | |
20220901JQC & QOBH0582 | XX 세탁기 |
- 여기서 상품명은 식별자 전체(주문번호 & 상품번호)가 아닌 일부(상품번호)에만 종속적이다. 이를 '부분 종속'이라고 한다.
따라서, 엔터티를 추가하여 부분 종속 문제를 해결하면 된다.
주문번호(FK) | 상품번호(FK) |
20220901JQB | CHKQ0138 |
20220901JQC | QOBH0582 |
상품번호 | 상품명 |
CHKQ0138 | OO 청소기 |
QOBH0582 | XX 세탁기 |
-> 부분종속 제거
3. 제3정규형: 엔터티의 일반 속성 간에는 서로 종속적이지 않는다.
아래의 표를 보자.
주문번호 | 고객번호 | 고객명 | 고객주소 |
20220901JQB | 10000 | 김OO | ABCDE |
일반 속성인 '고객명과 고객 주소'는 일반 속성인 '고객번호'에 종속적이다. 이를 이행적 종속(Transitive Dependency)라고 한다.
예시를 들어보자. 고객이 이사를 해서 '고객 주소'를 변경하게 되면, 위 엔터티의 모든 '고객 주소'를 갱신해야 한다. 똑같이 고객이 자신의 익명성을 위해 고객명을 수정하면, 위 엔터티의 모든 '고객명'을 갱신해야 한다.
이러한 이행적 종속을 해결하기 위해서는, 위 엔터티를 분리해서 관리해야 한다.
주문번호 | 고객번호 |
20220901JQB | 10000 |
고객번호 | 고객명 | 고객주소 |
10000 | 김OO | ABCDE |
-> 이행종속 제거
정규화는 필수적이지만 무조건적이진 않다. 반 정규화를 진행할 수도 있는데, 이때 '정규화를 진행한 후'에 반 정규화를 진행하는 것이 전제로 깔려있다.
4. 반정규화와 성능
- 반 정규화는 위의 정규화를 반대로 하는 것을 의미한다. 즉, 성능을 위해 데이터 중복을 허용하는 것이다. 엔티티가 합쳐지니, '조회'에서는 유리해질 수밖에 없다.
- 반 정규화는 '조회 성능'을 향상시킬 수 있으나, '입력/수정/삭제' 성능은 저하될 수 있다.
항상 유의해야 하지만, 반정규화가 꼭 필요한지 검증해보고, 다른 방법은 없는지 검토한 다음에 반정규화를 적용해야 한다.
Quiz.
Q1. 각각의 정규화를 설명하여라.
- 제 1정규형: 모든 속성은 반드시 하나의 값을 가져야 한다 -> ( ) 제거
- 제 2정규형: 엔티티의 일반속성은 주식별자 전체에 종속적이어야 한다 -> ( ) 제거
- 제 3정규형: 엔티티의 일반속성 간에는 서로 종속적이지 않는다. -> ( ) 제거
'SQLD' 카테고리의 다른 글
1-2-3. 모델이 표현하는 트랜잭션의 이해 (0) | 2022.09.19 |
---|---|
1-2-2. 관계와 조인의 이해 (1) | 2022.09.19 |
1-1-5. 식별자 (1) | 2022.09.19 |
1-1-4. 관계 (0) | 2022.09.19 |
1-1-3. 속성 (0) | 2022.09.19 |