Sad Puppy 3 [1과목] 데이터 모델과 SQL - 01. 정규화 :: 개발자 아지트

01. 정규화

: 데이터에 대한 중복을 제거하고 데이터가 관심사별로 처리되도록 엔터티를 쪼개 성능을 향상(조회/입력/수정/삭제 등)을 시키는 활동

단, 정규화가 대체로 좋은 것이며, 경우에 따라서는 반정규화(정규화의 반대)가 더 이득일 수도 있음

 

(반정규화: 중복을 포함하려고하고 엔터티를 합치는 과정임)

 

대부분 정규화를 거의하고, 특수한 사례에 대해서 반정규화를 진행함 

중복을 막기위헤 두번 입력된 데이터에 대해서 엔터티를 뜯었음

 

정규화시 입력/삭제/수정(DML)은 (무조건)성능 향상! 조회는 성능 향상 속은 저하 될 수 있음 


함수적 종속이란? F(X) = Y

: 정규화를 하기 위해 알아야 하는 개념으로 어떤 기준 값(컬럼(=속성))에 의해 데이터가 종속되는 현상을 의미함

 

만약 X가 Emp001이면 Y는 아이디 Emp001에 종속되는 유일한 인스턴스가 나옴

X: 결정자

Y: 종속자 

ex) 결정자(아이디) -> 종속자(이름, 나이, 연봉, 부서ID, 부서명) : 아이디가 나머지 모든 컬럼을 함수종속한다. 

ex) 결정자(부서ID) -> 종속자(부서명) : 부서ID가 부서명 컬럼을 함수종속한다. 


정규화 과정 상세히 알아보기 (시험에 잘 나옴)

대상의 형으로 가기까지 중간에 순서를 건너뛸 수 없음

 

비정규형: 데이터가 중복이 되어있어서 정규화가 필요한 상태 

도메인 원자성: 1차 정규화

1NF: 1차 정규화(도메인워자성 충족)를 통해 1차 정규형을 만들 수 있음 

 


정규화(1차 정규화)

: 엔터티에서 다중 속성이 있거나 하나의 속성에 여러 속성값이 있으면 원자값(1개)으로 쪼개준다. 

= 원자성을 확보하기 위한 활동

= 하나의 속성에 하나의 값을 가질 수 있도록 쪼개줌 

비정규형 ->(1차 정규화) 1차 정규형

 

정규화의 대상 (위)

 


정규화(2차 정규화)

: [1정규형 -> 2정규형(NF)] 형태로 엔터티를 변경하는 활동이다. 

식별자에 부분 종속 하는 대상을 쪼개어 준다.

즉, 결정자 전부에 나머지 컬럼이 완전 종속하지 않고, 결정자 부분적으로도 종속한다면 쪼개야 한다.

 

*2차 정규화 푸는 팁*

1. 위에서 부분적 종속한다고 하는 것들을 따로 뜯어낸다. (결정자는 주식별자로)

 

2. 기존의 엔터티에서 학번이 가져간 일반속성을 제외하고 입력한다. 

 

3. 기존의 데이터를 파악하여 관계를 설정한다. 

 


정규화(3차 정규화) : 이행종속제거

엔터티에서 일반속성끼리 함수종속이 발생하면 쪼개준다. 

 

이행종속:

직원 ID를 통해 부서 ID를 식별할 수 있고, 부서 ID를 통해 부서명을 식별할 수 있으면 이행종속이라고 함. 

 

결정자(직원ID) -> 종속자(나머지 컬럼들) //완전함수종속! 2NF 만족

 

그런데 나머지 일반 컬럼중에서 결정자(부서ID) -> 종속자(부서명) 이 발생했음

이걸 쪼개줘야 함. 방법은 2차 정규화에서 했던 방식처럼 동일


반정규화(=역정규화)도 알아보자 (현재 시험 범위에서는 빠진것)

: 정규화한 데이터를 다시 합쳐서 중복되게 하거나 통합, 분리 등을 수행하는 모델링 방식

 

1. 테이블 반정규화 (테이블 병합, 테이블 분할, 테이블 추가 등)

2. 컬럼 반정규화 (중복컬럼, 파생컬럼, 이력테이블 컬럼 추가 등)

3. 관계 반정규화 (중복관계 추가)

 

정규화 vs 반정규화? = 성능 향상을 위해 진행함(조회를 할 경우 대부분 정규화 한 상태가 좋지만, 반정규화 상태에서도 좋을 수도 있음)

비정규화 상태 -> 정규화한 정규형 상태

 

입력, 수정, 삭제시 정규화한 상태가 무조건 좋음


반정규화 대상 조사 방법(실무에서는 반정규화를 거의 안함)

 

(반정규화는 데이터의 무결성을 깰 위험이 있다. 그래서 가급적 다른 방법을 생각해보고 안되겠다 싶을때 한다. )

1. 반정규화가 필요한 대상을 찾아본다. 

2. 다른 방법이 없는지 검토해본다. 

3. 달리 방법이 없다면 반정규화를 적용한다.

  • 1. 테이블 반정규화 (테이블 병합, 테이블 분할, 테이블 추가 등)
  • 2. 컬럼 반정규화 (중복컬럼, 파생컬럼, 이력테이블 컬럼 추가 등)
  • 3. 관계 반정규화 (중복관계 추가)

컬럼 반정규화

* 종류가 많으므로 대표적인 예시만 몇 개 소개한다. 

 

(1) 중복컬럼 추가 

  • 테이블에 중복되는 컬럼을 추가해 조인을 감소시킨다. 

 

두 엔티티 중에서 일부만 수정할 경우 데이터의 무결성이 깨질 위험이 있음, 따라서 반정규화는 거의 하지 않음

 

+ Recent posts