11회차 데이터베이스 | 정규화와 역정규화 관련 내용 정리

728x90
DB 정규화, 비정규화(역정규화)

01. 이상현상 | Anomaly

1. 이상현상의 개념

  • 잘못 설계된 테이블에 데이터 질의 (SELECT) 할 때는 문제가 없는데, 그 외의 데이터 조작 (삽입, 삭제, 수정)을 하면 문제가 발생하는 것을 ‘이상 현상’이라고 말한다.
  • 이상현상이란, 테이블에 튜플 1) 삽입 시 부득이하게 NULL값 입력되거나 2) 삭제 시 연쇄 삭제 현상 발생하거나 3) 수정 시 데이터 일관성 훼손되는 현상
  1. 삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값이 없어서 NULL 입력해야 하는 현상
  2. 삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상
  3. 수정 이상 : 튜플 수정 시 중복된 데이터의 일부만 수정되어 데이터 일관성 훼손되는 현상

2. 이상현상의 예시

한 릴레이션에 두 개 이상의 정보가 포함될 경우 이상현상이 나타난다.

이상현상 나타나는 테이블

1) 삽입 이상

삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값이 없어 NULL값 입력해야 하는 현상

박세리 학생이 체육학과에 입학해서 INSRERT문으로 (학생번호,이름, 학과,주소)정보를 삽입했다.

→ 그런데, 아직 수강 신청은 하지 않은 상태라 (강좌이름, 강의실) 일부 속성에는 NULL값을 입력해야 한다.

→ NULL값은 테이블에 가능한 없어야 한다.

→ NULL값 문제 발생

2) 삭제 이상

삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상

장미란 학생이 스포츠경영학 과목 수강 취소하여 DELETE 문으로 3번째 튜플 삭제했다.

→ 스포츠경영학 과목 수강 취소 처리는 되었지만, 아예 장미란 학생의 기본 정보까지 없어진다.

→ ‘연쇄 삭제 문제 발생

3) 수정 이상

수정 이상 : 튜플 수정 시, 중복된 데이터 中 일부만 수정되어 데이터 일관성 깨지는 현상

박지성 학생의 주소가 (영국 맨체스터→ 대한미국 서울)로 바뀌었다.

→ 위 테이블에서 박지성 선수 관련 튜플은 2개 있는데, 하나의 튜플 주소값만 바뀔 경우, 이후 SELECT 조회 시 서로 다른 주소값이 조회된다.

→ 데이터 불일치 문제 발생

🎈 이상 현상 해결 방법 : 테이블 분리 (= 정규화)

테이블 분리시키자.


→ 정규화 하기 위해서는 (함수 종속성)과 (PK)를 파악해야 한다.

02. 함수 종속성

1. 종속성 개념

  • 종속성이란, 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게(unique) 정해지는 관계
  • A → B 로 표기하며, A를 B의 결정자라고 한다.
  • 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존 관계

2. 함수 종속성

  • A→B , 왼쪽 속성의 모든 값에 대하여 오른쪽 속성의 값이 유일하게 결정될 때 B는 A에 함수적으로 종속한다고 본다.
  • 함수 종속성 : 릴레이션의 속성 간에 함수적으로 종속하는 성질

3. 함수 종속성 다이어그램

  • 직사각형 : 릴레이션의 속성
  • 화살표 : 속성 간 함수의 종속성 표현
  • 직사각형으로 묶음 : 복합 속성

4. 이상현상과 결정자

  • 이상현상은 한 릴레이션에 두 개 이상의 정보가 포함되어 있을 때 나타난다.
  • 학생 수강성적 릴레이션의 경우 학생 정보와 강좌 정보가 한 릴레이션에 포함되어 있기 때문에 이상현상이 일어난다.
  • 이상현상은 기본키가 아닌 속성이 결정자 역할을 하는 ‘종속적 관계’가 있을 때 발생한다.
→ 그래서, 함수 종속성을 파악하기 위해서는 PK(기본키)를 찾아야 한다.
(PK) 기본키는 릴레이션의 모든 속성에 대한 결정자이다.
아래의 표에서 모든 속성을 결정짓는 애는 ‘복합키’ 형태의 (학생번호, 강좌이름) 이다.

이상현상 테이블 분리 모습


03. 정규화 | Normalization

1. 정규화의 개념

  • 정규화 : 테이블 간 중복된 데이터 허용하지 않으면서 이상현상 일으키지 않도록 릴레이션 분해하는 과정
  • 이상현상이 있는 릴레이션은 이상현상 일으키는 ‘함수 종속성 유형’에 따라 등급 구분 가능
  • 릴레이션은 정규형 개념으로 구분하며, 정규형 높을수록 이상현상 줄어듬

정규형 분류

2. 정규화의 목적

  • 중복 데이터 최소화하여 테이블 불일치 위험 최소화
  • 수정,삭제 이상 현상 방지하여 데이터 구조의 일관성을 최대화
  • 데이터 삽입 시 릴레이션 재구성에 대한 필요성 줄임

3. 정규화 한 눈에 보기

정규화 한 눈에 보기


기본 정규형 (1NF, 2NF, 3NF,BCNF)

(1) 1NF | 제 1 정규형 | 속성의 원자성 확보

릴레이션의 모든 속성값이 원자값을 가져야 한다.

→ 한 속성에 2개 이상 값을 갖는 경우 제거함

  • 즉, 아래의 왼쪽 표처럼 한 속성에 2개 이상의 값을 가진 상태면 안된다.
  • 오른쪽 표처럼 각 속성에 대한 값은 원자적인 릴레이션은 ‘제 1정규형’이다.

1NF 예

(2) 2NF | 제 2 정규형 | 부분 종속성 제거

릴레이션 내의 모든 칼럼에 부분적 종속이 없어야 한다. ( 완전 함수 종속 관계여야 한다.)

  • 기본키가 2개 이상의 속성으로 구성된 복합키일 경우, 부분 함수 종속성을 제거해야 한다.
  • 릴레이션이 제1정규형에 속하고, 기본키가 아닌 모든 속성이 기본키에 완전 함수 종속되면 제 2정규형에 속한다. (즉, 복합키의 부분집합 키가 결정자가 되어서는 안된다.)

→ 이상현상 원인 : 복합 PK의 일부 속성에 한 번 더 종속되는 속성이 있을 때 (=완전 종속X 부분 종속될 때) 이상 현상이 발생한다.

💡 부분 함수 종속
기본키가 복합키일 때, 복합키의 부분집합도 결정자가 되어 다른 속성이 종속되는 것
💡 완전 함수 종속
기본키가 복합키일 때, 오직 복합키 전체만이 결정자가 되는 것 (복합키 내부의 부분집합이 결정자가 되어서는 안된다.) 즉, 기본키에 대해서 완전 종속

부분 함수 종속성 제거

(3) 3NF | 제 3정규형 | 이행 종속성 제거

릴레이션이 제2정규형에 속하고 (기본키가 아닌 속성)이 기본키에 비이행적으로 종속 (= 기본키에 직접적으로 종속) 할 때 제 3 정규형을 만족한다.

→ 기본키 이외의 다른 속성 간 종속성을 제거하여 각 속성이 기본키에만 종속되도록 하는 것이 제 3정규형의 핵심이다.

즉, 기본키 이외의 속성이 다른 속성의 결정자가 될 경우 이행적 종속 관계에 있으므로 분리시켜줘야 한다.

💡 이행적 종속성: 어떤 속성이 PK에 직접 종속이 아닌, 그 외의 속성을 거쳐 간접적으로 종속되는 형태.

 릴레이션의 속성 A, B, C가 주어졌을 때 (A→B, B→C)가 성립하면서, (A→C)까지 성립하게 된다. 이 경우, 속성 C가 이행적으로 A에 종속한다(A→C)고 본다.

 왜?
-  여기서 A가 릴레이션의 기본 키(PK)라고 한다면, (기본키는 모든 속성에 대한 결정자이므로) A→B, A→C 를 결정하는 건 문제가 없다.
그런데, B→C가 성립하게 됨으로써 C가 A(PK) 외에 B에도 함수적으로 종속하는 형상이 일어난다. (= 기본키 이외의 속성이 결정자가 된 상태)
  이 경우, C는 A에 직접 함수적으로 종속하면서도 B를 거쳐 A에 이행적으로 종속되는 상태가 된다. 이를 두고, 이행적 종속성으로 칭한다.

이행적 종속성 제거

(4) BCNF | 보이스-코드 정규화

결정자가 후보키가 아닌 종속성 제거한다.

  • BCNF : 제 3정규형 만족하면서 모든 결정자가 후보키 집합에 속해야 한다.
  • 릴레이션에 존재하는 함수 종속성에서 모든 결정자가 후보키인 상태
  • 이상현상 원인 : 후보키가 아니면서 결정자인 속성이 존재할 경우 이상 현상이 발생한다.

이러한 이상현상이 생기는 이유는 후보키가 아닌 속성이 결정자로서 역할하기 때문이다.

후보키는 유일성 & 최소성을 갖는 키이므로 이 릴레이션에서는 (학번, 과목명)이나 (학번, 담당교수)가 후보키가 된다.

즉, 담당 교수만으로는 후보키가 될 수 없다.

그런데, (담당교수)가 후보키가 아님에도 과목명을 결정하고 있다. 즉, 후보키가 아닌 속성이 결정자 역할을 하는 상황이다.

이를 해결하기 위해서는 모든 결정자가 항상 후보키가 되도록 릴레이션을 분해해주면 BCNF를 만족하게 된다.

후보키 아닌 결정자

→ 대부분 BCNF까지 정규화를 하면 실질적인 이상 현상이 없어지므로 BCNF까지 정규화를 한다고 한다.


고급 정규형 (4NF, 5NF)

(5) 4NF | 제 4정규형 | 다치 종속 제거

다치 종속을 제거해야 한다.

  • BCNF를 만족해야 하고, 다치 종속(Multi-valued Dependency)이 없어야 한다.
  • 한 릴레이션에서 한 속성이 값 하나를 결정하는 게 아니라, 1:N의 종속성을 갖는 경우 ‘다치 종속’ 이라고 본다.
  • 이럴 경우에는 중심이 되는 속성을 기준으로 릴레이션을 분리시켜주어야 한다.

ex. 과목 -> 교재 , 과목 속성이 교재 속성값 하나를 결정짓는 게 아니라 여러 개의 값을 결정(N)짓는 상태이다.

(6) 5NF| 제 5정규형 | 조인 종속 제거

4NF를 만족하면서, 조인에 의한 종속성이 있는 경우도 분해한 상태이다. (조인 종속 제거)

  • Project Join Normal Form(PJNF)라고도 불린다.

중복을 제거하기 위해 분해할 수 있을 만큼 전부 분해하는 것이다.

조인 종속성 : 하나의 릴레이션을 여러 개의 릴레이션으로 무손실 분해했다가 다시 결합할 수 있다면 조인 종속이라고 한다. 그래서 A릴레이션을 B, C로 분해했다가 다시 조인했을 때에도 그대로 A가 된다면 A는 조인 종속성이 있다고 본다. 

[궁금] 그렇다면 왜 조인 종속성을 제거시켜줘야 한다는 거지 ??????

→ 참고로 이렇게 정규형 과정을 거쳐 테이블을 쪼갠다고 해서 성능이 100% 좋아지는 것은 아니다.

→ 테이블을 쪼갤수록 추후 데이터 조회 시, Join(조인)을 유발하므로 CPU와 메모리를 많이 사용한다. 서비스에 따라 정규화 or 역정규화 과정을 진행해야 한다.

04. 역정규화 | De-Normalization

1. 역정규화 (=반정규화)

  • 성능 향상을 위해 정규화된 데이터 모델에서 중복, 통합, 분리 등을 수행하는 모든 과정을 의미한다. 반정규화를 적용하면 데이터 무결성이 깨질 수 있는 위험이 있다.
  • 의도적으로 정규화 원칙을 위배하는 행위
  • 데이터베이스 성능 향상을 위해 데이터 중복을 허용하고 조인 줄이는 데이터베이스 성능향상 방법

— 조회 속도는 향상시키지만, 데이터 모델 유연성은 낮아짐

2. 수행하는 이유

  • 정규화에 충실하여 종속성, 활용성이 향상되었지만, 되려 수행속도가 느려진 경우
  • 다량의 범위 자주 처리해야 할 경우
  • 특정 범위 데이터만 자주 처리해야 할 경우
  • 요약/집계 정보가 자주 요구될 경우

3. 반정규화 절차

  1. 반정규화 대상 조사
  2. 다른 방법 유도 검토
  3. 반정규화 적용

4. 반정규화 기법

(1) 테이블 반정규화

  • 테이블 병합
    • 1:1 관계 테이블 병합 : 1:1 테이블을 병합하여 성능 향상
    • 1:M 관계 테이블 병합 : 1:M 테이블을 통합하여 성능 향상
    • 슈퍼/서브 테이블 병합 : 슈퍼/서브 관계를 통합하여 성능향상.
  • 테이블 분할
    • 수직분할 : 컬럼단위의 테이블을 1:1로 분리하여 성능향상
    • 수평분할 : Row 단위로 집중 발생되는 트랜잭션을 분석하여 테이블을 분할
  • 테이블 추가
    • 중복테이블 추가 : 다른 업무 또는 서버가 틀린경우 동일한 테이블 추가 (원격 조인 제거)
    • 통계테이블 추가 : 집계함수 등을 미리 수행하여 계산해둔 테이블을 추가 ( 쿼리 수행시에 계산하지 않는다.)
    • 이력테이블 추가 : 마스터 테이블에서 자주 조회되는 레코를 중복하여 테이블 추가 ( 범위처리 최소화)
    • 부분테이블 추가 : 자주 이용하는 집중화된 칼럼이 있는경우 디스크I/O를 줄이기위해 별도의 컬럼만 테이블 추가

(2) 컬럼 반정규화

  • 중복칼럼 추가 : 조인시 성능저하를 예방하기위해, 중복되는 컬럼을 위치시킴
  • 파생컬럼 추가 : 트랜잭션이 처리되는 시점에 계산에 의해 발생되는 성능저하를 예방하기 위해 미리 계산하여 컬럼에 보관
  • ( 미리 계산한 컬럼 sum , sumtoValue)
  • 이력테이블 컬럼 추가 : 대량의 이력데이터 처리시 기능성컬럼(최근값, 시작일자, 종료일자) 를 추가한다.

(3) 관계 반정규화

  • 중복관계 추가 : 여러경로를 거쳐 조인 할 수 있지만, 성능저하를 예방하기위해 추가적인 관계를 맺는 방법(중복 FK)
📌 참고로 (테이블 반정규화 & 컬럼 반정규화) 는 데이터 무결성에 영향을 끼치지만, (관계의 반정규화)는 데이터의 무결성을 깨뜨리지 않는다
728x90