[DB] 데이터베이스의 정규화과정

EHOI·2023년 2월 15일
0

DB

목록 보기
6/6

정규화란?

  • 테이블(릴레이션)을 분리하는 과정을 말한다.
  • 분리를 하는 이유는, 테이블이 설계가 잘못 되어, 잘못된 함수 종속으로 인해서(데이터가 중복되는 등) 이상현상을 일으키기 때문이다.
  • 그래서 이를 해결하고자 정규화 과정을 거친다.

어떤 이상한 현상이 일어나나요?

  • 테이블에 데이터를 1. 삽입, 2. 수정, 3. 삭제 할때 부작용이 발생한다. (주의할 점 : 조회는 없음)
  • 이상현상을 설명하기 위해 예시 테이블을 만들어보겠다.
    아이디이름구매번호등급
    xodl태이20230201-11
    xodl태이20230201-21
    xodl태이20230201-31
    ekqls다빈20230201-42
    ekqls다빈20230201-52
  1. 삽입이상 : 말 그대로 삽입할 때 이상이 발생하는 문제

    아이디이름구매번호등급
    xodl태이20230201-11
    xodl태이20230201-21
    xodl태이20230201-31
    ekqls다빈20230201-42
    ekqls다빈20230201-52
    wjddbs정윤NULL

    새롭게 가입한 회원의 데이터를 삽입하고자 할 때 불필요한 데이터(구매번호)까지 삽입해야 한다.

  2. 갱신이상 : 중복 레코드가 있어서 일부 데이터만 갱신되어 데이터의 값이 서로 불일치하는 문제

    아이디이름구매번호등급
    xodl태이20230201-12
    xodl태이20230201-21
    xodl태이20230201-31
    ekqls다빈20230201-42
    ekqls다빈20230201-52

    태이 라는 회원의 등급이 일부만 2로 변경되고 일부는 1 그대로 남아있는 문제가 발생한다.

  3. 삭제이상 : 필요한 데이터까지 같이 삭제되는 문제

    아이디이름구매번호등급
    xodl태이20230201-11
    xodl태이20230201-21
    xodl태이20230201-31
    ekqls다빈20230201-42
    ekqls다빈20230201-52
    wjddbs정윤20230202-10

    정윤 이라는 회원이 구매를 취소하여 해당 데이터를 삭제하려고 할때, 회원 정보까지 모두 삭제되는 문제가 발생한다.

  • 즉 이렇게 관련없는 속성끼리 한 테이블에 모여 있어서 데이터를 삽입, 갱신, 삭제할 때 문제가 발생하는 것이 이상현상인데, 관련있는 속성이다 없는 속성이다를 구분하는 것이 함수종속이다. 함수가 종속되어 있지 않다면 = 즉 속성끼리의 관련이 없다면 릴레이션을 분리한다. (정규화 한다.)

그렇다면 함수적 종속성은 뭐죠?

  • 일단 함수에서 종속 관계를 표시할 때 X → Y 로 표시한다. X에 따라 Y의 값이 바뀌므로 X는 결정자 Y는 종속자라고 한다. 즉 Y는 X에 종속되어 있는 것이다.
  • 위의 테이블에서는 아이디에 의해 이름과 등급이 결정된다. 아이디 → 이름, 등급 으로 표현이 가능하다. 이 테이블에서는 아이디가 회원을 구분하는 기본키가 되기 때문에 더욱 그러하지만, 굳이 기본키나 후보키가 아니라도 결정자의 역할을 할 수 있다.

정규화를 시작해보자.

  • 정보처리기사 자격증을 공부할 때 도부이결다조를 열심히 외운 것을 생각하며 하나씩 비교해보자

주의할 점

  • 뒤죽박죽인 테이블을 정리할 때, 일상에서도 마찬가지지만, 함부로 버리면 안된다.
  • 즉 테이블을 정리하다가 데이터가 손실이 되면 안된다. ⇒ 무손실 분해를 보장하면서 정규화 과정을 거쳐야 한다.
  • 또한 분해된 테이블은 조인을 했을 때, 다시 분해되기 전의 테이블로 복원이 가능해야 한다. ⇒ 무손실 분해를 보장해야 한다.

제 1정규형

  • 첫번째는 도부이결다조의 도 다. 도메인 어쩌구 였는데,,
  • 테이블을 정리하기 위해서 가장 먼저 살펴볼 것은, 테이블 내에 모든 도메인이 더이상 분해될 수 없는 값, 즉 원자값으로 구성되어 있어야 한다.
    아이디이름구매번호등급
    xodl태이20230201-1,
    20230201-2,
    20230201-3 | 1 | 위 테이블처럼 구매번호 속성에 여러 값이 들어가 있으므로 아래와 같이 분리를 해주는 것이 첫번째 할일이다.
    아이디이름구매번호등급
    xodl태이20230201-11
    xodl태이20230201-21
    xodl태이20230201-31
    여기까지 정리가 된 테이블을 제 1정규형이라고 한다.

제 2정규형

  • 두번째는 부 였다.
  • 제 1정규형을 만족 + 기본키가 아닌 모든 속성이 기본키에 부분 함수 종속이 아닌(얘 때문에 부였구나) 완전 함수 종속된 것을 말한다.
  • 이 부분은 교재에 있는 테이블을 활용하겠다.
    아이디이름이벤트 번호당첨 여부등급
    xodl태이20230201-1Y1
    xodl태이20230201-2N1
    xodl태이20230201-3Y1
    ekqls다빈20230201-4N2
    ekqls다빈20230201-5Y2
    wjddbs정윤20230202-1N0
    • 이름은 아이디에 완전 종속적이다. 아이디 자체만으로 이름을 결정하니까
    • 이벤트 번호도 아이디에 따라 번호가 달라지므로 완전 종속
    • 당첨 여부는 아이디 만으로 결정되지 않는다. 아이디와 이벤트 번호 두가지를 모두 알아야 당첨 여부를 확인할 수 있다. 그래서 부분 함수 종속적이다.
    • 등급은 아이디에 따라 결정되므로 완전 함수 종속이다.
  • 그래서 부분 함수 종속인 당첨 여부 데이터를 분리를 하자!
    아이디이벤트 번호당첨 여부
    xodl20230201-1Y
    xodl20230201-2N
    xodl20230201-3Y
    ekqls20230201-4N
    ekqls20230201-5Y
    wjddbs20230202-1N
    아이디와 이벤트 번호로 당첨 여부를 결정할 수 있도록 완전 함수 종속적인 테이블을 하나 만들고
    아이디이름등급
    xodl태이1
    xodl태이1
    xodl태이1
    ekqls다빈2
    ekqls다빈2
    wjddbs정윤0
    아이디 만으로 각 속성의 값을 결정할 수 있는 완전 함수 종속적인 테이블을 하나 만들면 제 2정규형이 된다.

제 3정규형

  • 도부 결다조의 다.
  • 이행적 함수 종속 이라고 해서 우리가 흔히 아는 삼단 논법처럼 A → B, B → C이면 A → C이다. 를 만족하는 것을 말한다.
  • 제 3정규형에서는 기본키가 아닌 속성이 기본키에 대해 이행적 함수 종속을 만족하면 안된다.
  • 아래 테이블에서
    아이디등급할인율
    xodl11%
    ekqls22%
    wjddbs00%
    아이디 → 등급, 등급 → 할인율이다. 그래서 아이디 → 할인율로 이행적 함수 종속을 만족한다. 제 3정규형은 이를 만족하면 안되므로 분리하자!
    아이디등급
    xodl1
    ekqls2
    wjddbs0
    등급할인율
    11%
    22%
    00%
    이렇게 분리를 해두면 등급에 따라 할인율 정책이 바뀌었을 때 회원 한명 한명의 등급을 확인하고 일일이 할인율을 갱신해야하는 번거로운 일이 발생하지 않는다.

BCNF 정규형 (보이스/코드 정규형)

  • 도부이 다조의 !
  • 제 3정규형을 만족하면서, 모든 결정자가 후보키인 상태를 말한다.
  • 다음 요구사항을 보자
    • 한 학생은 하나의 과목에 대해 한 강사의 강의만 수강할 수 있다.

    • 각 강사는 하나의 과목만 가르친다.

    • 한 과목은 여러 강사가 담당할 수 있다.

      학번과목강사
      1알고리즘tom
      1자료구조chris
      2알고리즘tom
      2운영체제anne
      null네트워크olivia

      이렇게 어떤 강사가 어떤 과목을 가르치는지, 그리고 어떤 학번의 학생이 어떤 과목을 수강하는지에 대한 테이블이 한꺼번에 있으면 어떨까?

      아무도 수업을 듣지 않는 네트워크 수업의 학번이 null로 관리된다.

      학번, 과목 → 강사를 알아낼 수 있다.

      강사 → 과목을 알아낼 수 있다.

      이 테이블에서 강사는 후보키가 아니다. 강사 속성 하나 만으로 구별되는 데이터 하나를 찾을 수 없기 때문이다. (학번 1, 2 학생이 둘다 조회된다.)

      그러므로 결정자인 강사가 후보키가 아니므로 BCNF 정규형을 만족하지 못한다.

  • 그렇다면? 분해해보자!
    학번강사
    1tom
    1chris
    2tom
    2anne
    강사과목
    tom알고리즘
    chris자료구조
    anne운영체제
    olivia네트워크

그 다음 정규화 과정은?

  • 아직 다와 조가 남아있지만, 제 4, 5 정규형은 생략되어 있어 배우지 않았다.
  • 나중에 궁금하면 추가적으로 더 알아보겠다!

정규화 과정은 꼭 필요한 일일까?

  • 이상현상이 생기는 것을 보면 정규화는 필요하다고 보인다.
  • 하지만 너무 잘개 쪼개놓으면 데이터 값을 조회하기 위해 조인에 조인에 조인을 반복하며 성능이 느려질 수도 있다.
  • 즉 서비스에 따라 정규화, 비정규화 과정을 알아서 잘 선택해야 한다.
  • 정리하면
    • 정규화를 통해 중복 데이터를 줄여 메모리 요구량을 감소시킬 수 있고, 또 이상현상을 줄일 수 있다.
    • 하지만 조인이 많은 쿼리가 빈번히 일어난다면 성능의 저하가 일어나므로 비정규화가 필요하다.
      • 조인은 코스트가 크기 때문에! 꼭 고려해야 할 대상이다!
profile
#성장 #단단함 #평온함

0개의 댓글