CS

정규화 Normalization

김디니 2023. 2. 2. 11:51

정규화란?

종속성 이론을 이용하여 잘못 설계된 관계형 스키마를 더 작은 속성의 세트로 쪼개어 바람직한 스키마로 만들어 가는 과정이다.

스키마(schema): 데이터베이스의 구조, 제약조건에 관한 명세를 기술한 집합

 

정규화는 테이블 간 데이터의 중복을 줄이고 무결성을 향상을 위한 것이다.

중복된 데이터를 허용하지 않기 위해 1 ~  3 단계의 정규화 과정을 거친다.

 

목적

  • 안정성과 무결성을 유지한다.
  • 데이터의 중복을 없애면서 불필요한 데이터를 최소화시킨다.
  • 이상 현상을 방지하여 저장 공간을 최소화한다.
  • 테이블 구성을 논리적이고 직관적으로 할 수 있다.
  • 데이터베이스 구조 확장에 용이해진다.
  • 데이터 모형의 단순화가 가능해진다.
  • 개체와 속성의 누락 여부 확인이 가능하다.
  • 자료 검색과 추출의 효율성을 추구한다.

 

원칙

  • 정보의 무손실 표현
    • 하나의 스키마를 다른 스키마로 변환할 때 정보의 손실이 있어선 안된다.
  • 분리의 원칙
    • 하나의 독립된 관계성은 하나의 독립된 릴레이션으로 분리시켜 표현한다.
  • 데이터의 중복성 감소

 

 

 

제1정규화(1NF)

릴레이션에 속한 모든 도메인이 원자값(Atomic Value)만으로 되어있어야 한다.

릴레이션의 모든 속성이 단순 영역에서 정의된다.

즉, 테이블의 컬럼이 원자값(하나의 값)을 갖도록 테이블을 분해하는 것이다.

 

 

 

제2정규화(2NF)

​기본키가 아닌 모든 속성이 기본키에 대하여 완전 함수적 종속을 만족한다.

즉, 기본키의 부분집합 키가 결정자가 되어선 안된다.

 

예를 들어, 학생번호, 강좌이름, 강의실, 성적 칼럼이 있는 테이블이 있다고 가정해보자.

이때 학생번호화 강좌이름은 기본키이다.

 

학생번호와 강좌이름인 기본키는 성적을 결정하고 있다.

강의실은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다.

기본키(학생번호와 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 강의실을 분해하여 별도의 테이블을 만든다.

 

함수적 종속
→ 데이터들이 어떤 기준값에 의해 종속되는 것이다.

ex) 수강 테이블이 학번, 이름, 과목명으로 이루어져 있을 때 학번이 결정되면 과목명에 상관없이 학번에는 항상 이름이 대응된다. 
학번에 따라 이름이 결정될 때 이름을 학번에 함수 종속적이라고 한다. (학번 → 이름)

완전 함수적 종속
어떤 한 테이블에서 속성 A가 다른 속성 집합 B 전체에 대해 함수적 종속이지만, (A → B)
속성 집합 B의 어떠한 부분집합 C에는 함수적 종속이 아닐 때 (A →x C)
속성 A는 속성 집합 B에 완전 함수적 종속이라고 한다.

 

 

 

제3정규화(3NF)

기본키가 아닌 모든 속성이 기본키에 대해 이행적 종속을 만족하지 않는다.

 

이행적 종속
A  → B이고 B → C일 때 A  → C를 만족하는 관계이다.

이 테이블의 속성들 관계는 학생번호 → 강좌이름 → 수강료이다.

 

여기서 이행적 종속을 제거하는 이유는 강좌를 변경할 시 수강료를 변경해야 하는 번거로움이 있기 때문이다. 

 

이행적 종속을 제거한, 제 3정규화를 거친 테이블은 이러한 형태가 되는 것이다.

 

 

 

BCNF(Boyce-Codd 정규형)

결정자가 모두 후보키인 정규형이다. 

  • 제 3정규형에서 후보키가 여러 개 존재하고 서로 중첩되는 경우 적용하는 강한 제3규형이라고도 한다.
  • 모든 BCNF가 종속성을 보존하는 것은 아니다.

 

조건

  • 키가 아닌 모든 속성은 각 키에 대하여 완전 종속해야 한다.
  • 키가 아닌 모든 속성은 자신이 부분적으로 들어가 있지 않은 모든 키에 대하여 완전 종속해야 한다.
  • 어떤 속성도 키가 아닌 속성에 대해서는 완전 종속할 수 없다.

 


반정규화

시스템의 성능향상과 개발과 운영의 단순화를 위해 중복, 통합, 분리 등을 수행하는 데이터 모델링 기법이다.

데이터를 중복하여 성능을 향상시킨다.

 

데이터 무결성이 깨질 수 있지만, 반정규화를 하는 이유는

  • 데이터 조회 시 디스크 I/O량이 많아서 성능이 저하
  • 경로가 너무 멀어 조인으로 인한 성능저하 예상
  • 칼럼을 계산하여 읽을 때 성능저하 예상

과정

  • 첫 번째, 데이터 모델링을 할 때 정규화를 정확하게 수행한다.세 번째, 데이터 베이스에 발생되는 트랜잭션의 유형을 파악한다.다섯 번째, 이력 모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
  • 네 번째, 용량과 트랜잭션의 유형에 따라 [반정규화]를 수행한다.
  • 두 번째, 데이터 베이스 용량 산정을 수행한다.
  •  

 

 

데이터 모델링의 순서

  1. 데이터 모델링을 할 때 정규화를 정확하게 수행한다.
  2. 데이터 베이스 용량 산정을 수행한다.
  3. 데이터 베이스에 발생되는 트랜잭션의 유형을 파악한다.
  4. 용량과 트랜잭션의 유형에 따라 반정규화를 수행한다.
  5. 이력 모델의 조정, PK/FK 조정, 슈퍼타입/서브타입 조정 등을 수행한다.
  6. 성능 관점에서 데이터 모델을 검증한다.

'CS' 카테고리의 다른 글

함수형 프로그래밍 Fuctional Programming  (0) 2023.02.07
HTTP의 GET과 POST  (1) 2023.02.03
13913. 숨바꼭질4 [BAEKJOON / Python]  (0) 2023.01.27
클린코드와 리팩토링  (2) 2023.01.25
프로세스와 스레드 Process & Thread  (0) 2023.01.23