챕터02. 데이터 모델과 성능 - 2.2 정규화와 성능
- 정규화를 통한 성능 향상 전략
- 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상현상을 제거하는 것이다.
- 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.
- 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.
- 정규화된 데이터 모델은 조회 시에는 처리 조건에 따라 성능이 향상 혹은 저하된다.
- 정규화된 데이터 모델은 입력/수정/삭제 시 무조건 성능이 향상된다.
- 정규화 용어
용어 | 설명 |
정규화 (Normalization) |
- 함수적 종속성 등과 같은 이론에 근거하여 관계형 데이터베이스 테이블의 삽입·삭제·갱신 이상 현상 발생을 최소화하기 위해 좀 더 작은 단위의 테이블로 설계하는 과정이다. 즉, 데이터 모델을 정규형에 맞도록 고치는 과정 |
정규형 (NF: Normal Form) |
- 정규화 규정. 정규화 결과에 의해 도출된 데이터 모델이 갖춰야 할 특성이다. |
함수적 종속성 (FD: Functional Dependency) |
- 테이블의 특정 컬럼 A의 값을 알면 다른 컬럼 B 값을 알 수 있을 때, 컬럼 B는 A에 함수적 종속성이 있다고 한다. ex) 고객명은 고객주민등록번호에 함수적 종속성이 있다. |
결정자 (Determinant) |
- 함적 종속성 설명에서, 컬럼 A를 결정자 라고 한다. ex) 주민등록번호는 결정자가 된다. |
다치종속 (MVD: MultiValued Dependency) |
- 결정자 컬럼 A에 의해 컬럼 B의 값을 다수 개 알 수 있을 때, 컬럼 B는 컬럼 A에 다치종속되었다고 한다. - ex) 학번을 알면 해당 학생의 다수 개 수강과목을 알 수 있을 때, 수강과목은 학번에 다치종속 관계가 된다. |
- 정규화 효과 및 장점
- 상호 종속성이 강한 데이터 요소들을 분리, 독립된 개념(엔터티, 테이블)으로 정의하게 됨에 따라 High Cohesion & Loose Coupling (높은 응집도 & 낮은 결합도) 원칙에 충실해지며 이로 인해 유연성이 극대화된다.
- 개념이 좀 더 세분화됨에 따라 해당 개념에 대한 재활용 가능성이 높아진다 (일반적으로 각종 참조 모델은 정규형을 만족하고 있다.)
- Non-Key(일반 속성) 데이터 요소가 한번 만 표현됨에 따라 중복이 최소화 된다. (데이터 품질확보, 저장공간 절약, DML 성능 향상 등)
- 정규화 이론
- 1차, 2차, 3차, 보이스코드 정규화는 함수종속성에 근거하여 정규화를 수행하고,
- 4차 정규화는 속성의 값이 여러 개 발생하는 다치종속,
- 5차 정규화는 조인에 의해 발생하는 이상현상 제거로 정규화를 수행한다.
정규화 유형 | 설명 |
1차 정규화 | - 함수종속, 복수의 속성값을 갖는 속성을 분리, 속성의 원자성(더이상 쪼개지지 않는 값) 확보 |
2차 정규화 | - 함수종속, 주식별자에 완전종속적이지 않은 속성의 분리 - 부분종속 속성(PARTIAL DEPENDENCY ATTRIBUTE) 을 분리 |
3차 정규화 | - 함수종속, 일반속성에 종속적인 속석의 분리 - 이전종속 속성(TRANSITIVE DEPENDENCY)을 분리 |
보이스코드 정규화 | - 함수종속, 결정자 안에 함수종속을 가진 주식별자 분리 |
4차 정규화 | - 다치종속(Multi-Valued Dependency) 속성분리 |
5차 정규화 | - 결합종속(Join Dependency)일 경우는 두 개 이상의 N개로 분리 |
- 제 1정규형
- 모든 속성은 원자 값을 가져야 한다.
- 다중 값을 가질 수 있는 속성은 분리되어야 한다.
- 제 1 정규형 위반 ( 회원 엔티티 )
#회원 아이디 | 나이 | 성별 | 회원구분 | 연락처 |
sujilee | 25 | female | C | 010-1234-5678, sujilee@naver.com |
kolee | 30 | male | B | 010-5678-1234, kolee@nate.com |
parkes811 | 26 | male | A | 010-2944-1047, parkes811@naver.com |
- 연락처 속성에 두 가지 값이 들어가 있어 원자성을 만족시키지 못해 제 1 정규형을 위반했다.
- 회원 연락처 엔터티를 추가하고, 연락처를 원자성을 만족하도록 나누어 저장한다.
- 제 2 정규형
- 제 1정규형을 만족하는 상태에서 모든 Non-key 컬럼은 기본 키 전체에 종속되어야 한다.
- 기본 키에 종속적이지 않거나 기본 키 일부 컬럼들에만 종속적인 컬럼은 분리되어야 한다.
- 제 2 정규형 위반 ( 고객주문 엔터티 )
# 고객 아이디 | # 주문 순번 (PK) | 주문 일자 | 고객명 | 고객 등급 |
C0001 | 0001 | 20221208 | 박은서 | A |
C0001 | 0002 | 20221208 | 박은서 | A |
C0002 | 0003 | 20221208 | 김철수 | B |
- 고객 주문 엔터티에 식별자는 복합식별자로써 고객아이디 + 주문 순번이다.
- 주문 일자는 복합 식별자(고객 아이디 + 주문 순번)에 종속되나, 고객명과 고객등급은 고객 아이디에만 종속된다.
- 이를 제 2 정규형 위반이라고 하고, 이 경우에 발생할 수 있는 문제점들은
- 주문 시 마다 고객정보 (고객명, 고객 등급)을 저장해야 하기 때문에 불필요한 데이터가 중복이 발생할 수 있다.
- 고객 정보를 모르면 주문이 불가능하고, 갱신 시에 갱신 이상이 발생할 가능성이 존재한다.
- 고객 엔터티를 따로 도출하여 고객 정보(고객명, 고객등급)을 관리한다.
- 고객주문 엔터티에서 고객명과 고객등급을 필요로 할 때는 고객아이디로 Join 연산을 통해 정보를 얻을 수 있다.
- 제 3 정규형
- 제 2정규형을 만족하는 상태에서 일반속성들간에도 종속관계가 존재하지 않아야 한다.
- 일반속성들 간 종속관계가 존재하는 것들은 분리되어야 한다.
- 제 3 정규형 위반 ( 고객 엔터티 )
# 고객 아이디 (PK) | 고객명 | 나이 | 직업코드 | 직업명 |
C0001 | 박은서 | 26 | J001 | 개발자 |
C0002 | 이수지 | 28 | J002 | 미용사 |
C0003 | 박지성 | 38 | J003 | 축구선수 |
C0004 | 손흥민 | 21 | J004 | 건축가 |
- 고객 아이디로 고객명, 나이, 직업 코드를 결정하고, 직업 코드와 직업명이 함수 종속이 발생하기 때문에 제 3 정규형을 위반했다.
- 직업 엔터티를 도출해서 고객 엔터티는 직업 코드를, 직업 엔터티에서는 직업명을 관리하면 된다.
- 직업 엔터티를 추가하여 일반 속성끼리의 함수 종속을 제거한다.
- 정규화와 성능
- 정규화를 수행해서 조인이 발생하게 되더라도 효율적인 인덱스 사용을 통해 조인 연산을 수행하면 성능 상 단점은 거의 없다.
- 정규화를 수행하여 소량의 테이블이 생성된다면 소량의 테이블을 먼저 읽어 조인 연산을 수행하면 되므로 성능상 유리할 수 있다.
- 정규화가 제대로 되지 않으면 동일한 종류의 속성을 여러 개 가지고 있어서 과다한 인덱스가 만들어 질 수 있는데 정규화를 한다면 하나의 인덱스만 만들어도 된다.
- 반정규화 테이블의 성능저하 사례
- 함수적 종속성
- 함수적 종속성을 만족시키는 모든 과정을 정규화라고 한다.