[DB] 정규화 (+ 반정규화)

Benjamin·2023년 1월 19일
0

DB

목록 보기
7/8

정규화

탄생배경

한 릴레이션에 여러 엔티티의 애트리뷰트들을 혼합 -> 정보 중복 저장, 저장 공간을 낭비, 갱신 이상 발생

이러한 문제를 해결하기 위해 정규화 과정을 거치는 것이다.

갱신 이상의 종류

  • 삽입 이상(insertion anomalies)
    원하지 않는 자료가 삽입, 삽입하는데 자료가 부족해 삽입이 되지 않아 발생하는 문제점

  • 삭제 이상(deletion anomalies)
    하나의 자료만 삭제하고 싶지만, 그 자료가 포함된 튜플 전체가 삭제됨으로 원하지 않는 정보 손실이 발생하는 문제점

  • 수정(갱신)이상(modification anomalies)
    일부의 튜플만 갱신되어 정보의 일관성이 없어져 정확한 정보 파악이 되지 않는 문제점

정규화?

관계형 데이터베이스에서 중복을 최소화하기 위해 데이터를 구조화하는 작업
즉, 나쁜 릴레이션의 애트리뷰트들을 나누어서 좋은 작은 릴레이션으로 분해하는 작업

정규화 과정을 거치게 되면 정규형을 만족하게 된다.

  • 정규형이란 특정 조건을 만족하는 릴레이션의 스키마의 형태를 말하며 제 1 정규형, 제 2 정규형, 제 3 정규형, … 등이 존재

데이터 이상현상을 야기하는 속성간의 종속성을 분석해서 하나의 릴레이션에는 기본적으로 하나의 종속성이 표현되도록 분해하는 과정

정규화의 원리

  1. 분리의 원칙
    하나의 독립된 관계성은 별도의 릴레이션으로 분리시켜 표현

  2. 정보 표현의 무손실
    변환된 스키마가 표현하는 정보는 변환되기 전 정보를 모두 포함하고있어야 함

  3. 최소의 데이터 중복
    데이터 중복으로 인한 여러가지 이상현상이 제거되어야함

나쁜 릴레이션 파악하기

  • 엔티티를 구성하고 있는 애트리뷰트 간에 함수적 종속성을 판단
  • 각각의 정규형마다 어떠한 함수적 종속성을 만족하는지에 따라 정규형이 정의

함수적 종속성 (Functional Dependency)

애트리뷰트 데이터들의 의미와 애트리뷰트들 간의 상호 관계로부터 유도되는 제약조건

  • X 와 Y 를 어떤 애트리뷰트 집합이라고 할 때, X 의 값이 Y 의 값을 유일하게 결정한다면 X 가 Y 를 함수적으로 결정한다 또는 Y 는 X 에 함수적 종속 이라한다 (X → Y)
  • X → Y 관계에서 X 를 결정자 (Determinant), Y 를 종속자 (Dependent) 라고 한다

각각의 정규형은 어떠한 조건을 만족해야 하는가?

  • 분해의 대상인 분해 집합 D 는 무손실 조인 을 보장해야 한다.
  • 분해 집합 D 는 함수적 종속성을 보존해야 한다.

무손실 조인 분해 (Nonloss Decomposition)
하나의 릴레이션을 분해하고, 다시 조인연산했을 때 데이터 손실이 없는 것

제 1 정규형

  • 애트리뷰트의 도메인이 오직 원자값만을 포함하고, 튜플의 모든 애트리뷰트가 도메인에 속하는 하나의 값을 가져야 한다.
    -> 원자값이란 더 이상 쪼개질 수 없는 단위
    -> 즉, 복합 애트리뷰트, 다중값 애트리뷰트, 중첩 릴레이션 등 비 원자적인 애트리뷰트들을 허용하지 않는 릴레이션 형태를 말한다.


예를 들어 위처럼 릴레이션이 이루어져 있다면, 제1 정규형을 만족하지 못한다.
학번이 100인 학생의 과목 번호와 성적이 2개로 이루어져 있기 때문이다. 따라서 제1 정규형이 되려면 다음과 같이 속성 값을 분리해주어야 한다.

제1 정규형에서는 어떠한 이상현상이 발생할까?

  • 삽입 이상 : 학생이 새 과목을 수강 신청할 때 반드시 학생의 학과와 지도교수를 알아야 한다. (불필요한 정보)

  • 삭제 이상 : 300번 학생이 C400 과목을 취소하면, 해당 과목에 대한 정보가 모두 사라진다.

  • 갱신 이상 : 100번 학생이 지도교수를 변경할 때, P1인 행을 모두 찾아서 변경해주어야 한다.

제1 정규형에서 이러한 이상현상이 발생하는 이유는, 기본키(primary key)가 아닌 속성들이 기본키에 완전 함수 종속되지 못하고 부분 함수 종속되어 있기 때문이다. 즉, 기본키의 일부 속성에만 의존하고 있기 때문이다. 아래의 그림을 참고하면 기본키는 (학번, 과목 번호)이고, 지도교수와 학과가 부분 함수 종속되어 있다.

제 2 정규형

제1 정규형이면서, 기본키(primary key)에 속하지 않은 속성 모두가 기본키에 완전 함수 종속인 정규형을 말한다.

위 그림처럼 각 속성들이 모두 완전 함수 종속이 되도록 릴레이션을 분리시켜준다. 따라서 아래와 같이 릴레이션이 형성된다.

제2 정규형에도 여전히 이상현상이 존재한다.

  • 삽입 이상 : 지도교수가 학과에 소속되어 있음을 추가할 때 반드시 지도 학생이 있어야 한다. (불필요한 정보 필요)

  • 삭제 이상 : 300번 학생이 자퇴하는 경우 P3 교수의 학과 정보가 사라진다.

  • 갱신 이상 : 지도교수의 학과가 변경되는 경우 모두 찾아서 변경시켜주어야 한다. (지도교수가 동일한 학생이 여러 명 있는 경우)

제2 정규형에서 이상현상이 여전히 발생하는 이유는 '이행적 함수 종속성' 때문이다. 이행적 함수 종속성은 속성이 A→B이고, B→C이면서 A→C의 관계에 있는 것을 말한다.

위 예시에서는 학번 → 지도교수, 지도교수 → 학과, 학번 → 학과의 관계가 존재한다.

따라서 지도교수의 학과를 추가하기 위해서 지도 학생까지 필요하게 되고, 학생이 자퇴하였는데 지도교수의 학과 정보가 사라지는 문제점이 발생하게 되는 것이다.

제 3 정규형

제3 정규형은 제2 정규형이면서, 이행적 함수 종속성을 제거한 정규형을 말한다.

즉, 기본키 이외의 속성이 그 외 다른 속성을 결정할 수 없는 것이다.

BCNF (Boyce and Codd Normal Form)

BCNF 은 제3 정규형을 조금 더 강화시킨 개념이다. 강한 제3 정규형이라고도 한다.
모든 결정자가 후보키인 정규형이다.

아래와 같은 제3 정규형을 만족하는 릴레이션이 있다고 가정하자. 한 교수당 하나의 수업만 맡는다고 가정한다.

이렇게 되면 제3 정규형을 만족한다. 이 경우에는 어떤 이상현상이 생길까?

  • 삽입 이상 : 새로운 교수가 특정 과목을 담당한다는 새로운 정보를 추가할 수 없다. 적어도 한 명 이상의 수강 학생이 필요하다.

  • 삭제 이상 : 학번 100이 C234 과목을 취소하면, P2가 C234 과목을 담당한다는 정보도 삭제된다.

  • 갱신 이상 : P1의 과목이 변경되면 P1인 행을 모두 찾아 변경시켜주어야 한다.

이러한 이상현상이 생기는 이유는, 결정자(Determinant)가 후보키(Alternative Key)로 취급되고 있지 않기 때문이다.

후보키는 슈퍼키(super key) 중에서 최소성을 갖는 키이므로 이 릴레이션에서는 (학번, 과목명)이나 (학번, 담당교수)가 후보키가 된다. 담당 교수만으로는 후보키가 될 수 없다.

하지만, 후보키가 아님에도 과목명을 결정할 수 있다.

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


// ?? 왜 이렇게 분리되지 테이블이??

정규화의 장점

  • 데이터 변경시 이상현상 제거 가능
  • 새로운 데이터형의 추가로 인한 확장 시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 된다.
  • 사용자에게 더 의미있는 데이터 모델 제공
  • 응용 프로그램단에서 불필요한 로직 제거
  • 불필요한 쿼리 제거로 성능 향상(서브쿼리...)

정규화의 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 연산(JOIN 연산)이 많아진다. 이로 인해 질의에 대한 응답 시간이 느려질 수 있다.

구체적으로, 데이터의 중복 속성을 제거하고, 일반 속성이 하나의 테이블로 집약되므로 한 테이블의 데이터 용량이 최소화되는 효과가 있다.
따라서 정규화된 테이블은 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있는 특성이 있다.

단점에서 미루어보았을 때 어떠한 상황에서 정규화를 진행해야 하는가? 단점에 대한 대응책은?

조회를 하는 SQL 문장에서 조인이 많이 발생하여 이로 인한 성능저하가 나타나는 경우에 반정규화를 적용하는 전략이 필요하다.


반정규화(De-normalization, 비정규화)

반정규화는 정규화된 엔티티, 속성, 관계를 시스템의 성능 향상 및 개발과 운영의 단순화를 위해 중복 통합, 분리 등을 수행하는 데이터 모델링 기법 중 하나이다.

  • 디스크 I/O 량이 많아서 조회 시 성능이 저하
  • 테이블끼리의 경로가 너무 멀어 조인으로 인한 성능 저하가 예상
  • 칼럼을 계산하여 조회할 때 성능이 저하될 것이 예상

위와 같은 경우 반정규화를 수행하게 된다.
일반적으로 조회에 대한 처리 성능이 중요하다고 판단될 때 부분적으로 반정규화를 고려하게 된다.

반정규화의 대상

  • 자주 사용되는 테이블에 액세스하는 프로세스의 수가 가장 많고, 항상 일정한 범위만을 조회하는 경우
  • 테이블에 대량 데이터가 있고 대량의 범위를 자주 처리하는 경우, 성능 상 이슈가 있을 경우
  • 테이블에 지나치게 조인을 많이 사용하게 되어 데이터를 조회하는 것이 기술적으로 어려울 경우

주의할 점

반정규화를 과도하게 적용하다 보면 데이터의 무결성이 깨질 수 있다.
또한 입력, 수정, 삭제의 질의문에 대한 응답 시간이 늦어질 수 있다.


참고사이트
https://code-lab1.tistory.com/48
https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/Database#정규화에-대해서
https://swingswing.tistory.com/92
https://rebro.kr/160

0개의 댓글