으쌰으쌰💪/SQL

데이터 모델과 성능 - 정규화와 성능

_꼬마돌 2023. 8. 16. 19:50
반응형

정규화를 통한 성능 향상 전략

1. 정규화를 수행한다는 것은 데이터를 결정하는 결정자에 의해 함수적 종속을 가지고 있는 일반 속성을 의존자로 하여 입력/수정/삭제 이상현상을 제거하는 것이다. 

2. 데이터의 중복 속성을 제거하고 결정자에 의해 동일한 의미의 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다. 

3. 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다. 

 

- 정규화된 데이터 모델은 조회시에는 처리 조건에 따라 성능이 향상 혹은 저하된다. 

- 정규화된 데이터 모델은 입력/수정/삭제 시 무조건 성능이 향상된다. 

 

결정자

결정자의 예로 "고객" 엔티티의 "고객번호"를 들 수 있다. 

고객번호는 고객의 이름을 결정하고, 고객의 성별을 결정한다. 고객의 이름과 성별이 고객번호에 속해있기 때문이다. 고객번호는 결정자, 이름과 성별은 의존자이다. 

 

정규화 용어

정규화 (Normalization)

- 함수적 종속성(FD: Functional Dependancy) 등과 같은 이론에 근거하여 관계형 데이터베이스 테이블의 삽입, 삭제, 갱신, 이상(Anomaly) 현상 발생을 최소화하기 위해 좀 더 작은 단위의 테이블로 설계하는 과정. 즉, 데이터 모델을 정규형에 맞도록 고치는 과정.

 

정규형 (NF: Normal Form)

- 정규화 규정. 정규화 결과에 의해 도출된 데이터 모델이 갖춰야 할 특성.

 

함수적 종속성 (FD: Functional Dependancy)

- 테이블의 특정 컬럼 A의 값을 알면 다른 컬럼 B 값을 알 수 있을 때, 컬럼 B는 컬럼 A에 함수적 종속성이 있다고 함.

(ex. 고객명은 고객주민등록번호에 함수적 종속성이 있음)

 

결정자 (Determinant)

- 함수적 종속성 설명에서, 컬럼 A를 결정자라고 함. (ex. 주민등록번호는 결정자임)

 

다치종속 (MVD: MultiValued Dependancy)

- 결정자 컬럼 A에 의해 컬럼 B의 값을 다수 개 알 수 있을 때, 컬럼 B는 컬럼 A에 다치종속 되었다고 함.

(ex. 학번을 알면 해당 학생의 다수 개 수강과목을 알 수 있을 때, 수강과목은 학번에 다치종속관계임)

 

정규화 효과 및 장점

1. 상호 종속성이 강한 데이터 요소들을 분리, 독립된 개념(엔티티, 테이블)으로 정의하게 됨에 따라 High Cohesion & Loose Coupling(높은 응집도 & 낮은 결합도) 원칙에 충실해지며, 이로 인해 유연성이 극대화됨. 

2. 개념이 좀 더 세분화됨에 따라 해당 개념에 대한 재활용 가능성이 높아짐 (일반적으로 각종 잠조 모델은 정규형을 만족하고 있음)

3. Non-key(일반 속성) 데이터 요소가 한 번만 표현됨에 따라 중복이 최소화됨. (데이터 품질 확보, 저장공간 절약, DML 성능)

 

정규화 이론

1. 1차, 2차, 3차, 보이스코드정규화는 함수종속성에 근거하여 정규화를 수행하고, 

2. 4차 정규화는 속성의 값이 여러개 발생하는 다치종속, 

3. 5차 정규화는 조인에 의해 발생하는 이상현상 제거로 정규화를 수행한다. 

 

1차 정규화 *중요

- 함수종속, 복수의 속성값을 갖는 속성을 분리, 속성의 원자성 확보

 

2차 정규화 *중요

- 함수종속, 주식별자에 완전종속적이지 않은 속성의 분리

- 부분종속 속성(Partial Dependancy Attribute)을 분리

 

3차 정규화 *중요

- 함수종속, 일반속성에 종속적인 속성의 분리

- 이전종속 속성(Transitive Dependancy)을 분리

 

보이스-코드 정규화

- 함수종속, 결정자안에 함수종속을 가진 주식별자 분리

 

4차 정규화

- 다가 종속(Multi-Valued Dependancy) 속성 분리

 

5차 정규화

- 결합종속(Join Dependancy)일 경우는 두 개 이상의 N개로 분리

 

제 1 정규형

1. 모든 속성은 원자 값을 가져야 함

2. 다중 값을 가질 수 있는 속성은 분리되어야 함.

 

제 1 정규형 위반 예시

- 회원 엔티티

- 연락처 속성에 두 가지 값이 들어가 있음

- 이럴 경우 제 1 정규형 위반임.

 

제 1 정규형 위반 해소

-회원 엔티티

=> 연락처 속성을 삭제.

- 회원 연락처 엔티티

=> 회원 연락처 엔티티 추가

=> 기존의 회원 엔티티에서 회원 연락처 엔티티를 추가하여 제 1 정규형을 만족하게 한다.

 

제 2 정규형

1. 제 1 정규형을 만족하는 상태에서 모든 Non-key 컬럼은 기본 키 전체에 종속되어야 한다. 

2. 기본 키에 종속적이지 않거나 기본 키 일부 컬럼(들)에만 종속적인 컬럼은 분리되어야 한다. 

 

제 2 정규형 위반 예시

- 고객 주문 엔티티

위 예시는 "고객아이디 + 주문순번"가 PK로 이뤄진 복합 식별자이다. 주문일자의 경우 고객아이디와 주문순번을 알면 도출해낼 수 있는 컬럼으로 기본키 전체에 종속되어있다. 하지만 고객명과 고객등급은 고객아이디만으로도 알 수 있기 때문에 기본키 전체에 종속되어 있지 않다. 

- 올바른 집합 단위에 기초하고 있지 않음

- 갱신 시에 갱신 이상이 발생할 가능성 존재

- 주문 시마다 고객정보를 저장해야함

- 고객 정보의 중복이 발생할 수 있음

- 고객 정보를 모르면 주문이 불가능함

 

제 2 정규형 위반 해소

- 고객주문 엔티티

 

- 고객 엔티티

=> 모든 속성이 식별자만으로 함수 종속 가짐

=> 식별자의 일부에만 종속하는 속성 없음

 

제 3 정규형

1. 제 2 정규형을 만족하는 상태에서 일반 속성들 간에도 종속관계가 존재하지 않아야함

2. 일반 속성들 간 종속관계가 존재하는 것들은 분리되어야함.

 

제 3 정규형 위반 예시

- 고객 엔티티

위 예시를 보면 일반키인 고객아이디로 고객명, 나이, 직업코드를 결정할 수 있다. 하지만 직업명은 직업코드가 결정한다. 직업코드와 직업명 모두 일반 속성인데 일반 속성 간에 종속이 발생하므로 제 3 정규형을 위반한 것이다.

- 식별자를 제외한 일반 속성 끼리 함수 종속이 발생

- 식별자 이외의 키 간 발생하는 함수의 종속

 

제 3 정규형 위반 해소

- 고객 엔티티

 

- 직업 엔티티

=> 직업 엔티티를 추가하여 일반 속성 끼리의 함수 종속을 제거함.

 

정규화의 성능

1. 정규화를 수행해서 조인이 발생하게 되더라도 효율적인 인덱스 사용을 통해 조인 연산을 수행하면 성능상 단점은 거의 없다. 

2. 정규화를 수행하여 소량의 테이블이 생성된다면, 소량의 테이블을 먼저 읽어 조인 연산을 수행하면 되므로 성능상 유리할 수 있다. 

3. 정규화가 제대로 되지 않으면 동일한 종류의 속성을 여러개 가지고 있어서 과다한 인덱스가 만들어질 수 있는데, 정규화를 한다면 하나의 인덱스만 만들어도 된다. 

 

함수적 종속성 (Functional Dependancy)에 근거한 정규화 수행 필요

1. 함수적 종속석(Functional Dependancy)은 데이터들이 어떤 기준값에 의해 종속되는 현상을 지칭하는 것이다. 

2. 이때, 기준값을 결정자(Determinant)라 하고, 종속되는 값을 종속자(Dependent)라고 한다. 

- 종속자는 근본적으로 결정자에 함수적 종속성을 가지고 있음.

- 이름, 출생지, 주소는 주민등록번호에 함수적 종속성을 가지고 있다. 즉, 주민등록번호가 이름, 출생지, 주소를 함수적으로 결정한다. 라고 말할 수 있다. 

반응형