정규화

이승주·2024년 3월 19일
0

DATABASE

목록 보기
4/4

📌 정규화란?

데이터 정합성(데이터의 정확성과 일관성을 유지하고 보장)과 이상현상 해결을 위해 엔티티를 작은 단위로 분리하는 과정

  • 정규화를 하는 경우 조회성능은 처리조건에 따라 향상될 수도 있고, 저하될 수도 있음
  • 단 입력, 수정, 삭제 성능은 향상됨

📌Anomaly 문제 상황 (이상현상)

삭제 이상

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

삽입 이상

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

수정 이상

튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상


📌 제 1 정규화

데이터 베이스의 Table내 하나의 컬럼에 여러 값이 들어가 있는 상황에서
데이터베이스의 각 컬럼이 하나의 데이터만 가지도록 하는 과정이다.

즉, 각 컬럼이 하나의 데이터만 저장하고, 여러 값을 가지지 않게 Table을 분리한다.

제 1 정규화 적용 전

DBMS에 대한 내용을 담은 topic table이 아래와 같이 있다.

  • 하나의 tag 컬럼안에 여러 데이터들이 들어가 있다.

발생할 수 있는 단점

단점 1. DBMS에서 가지고 있는 tag값을 조회하기 어렵다.

  • where 프로그램='rdb'가아닌 where 프로그램 LIKE '%rdb%'으로 찾아야함

단점 2. tag 값 수정시 두개의 값을 수정해줘야하는 번거로움이 있음

단점 3. Order By할 때 정렬에 어려움이 있음


제 1 정규화 적용 후

위 사진에서 볼 수 있듯이 tag 컬럼에 여러 data가 들어가 있는 것을 확인했다.
이에 따라 Topic table과 Tag table로 분리하려한다.

✔️ Table 분리할 때 체크해야하는 부분

  1. 증복된 컬럼이 어느 컬럼에서 발생하는지 확인 후 table을 분리한다.
  • 예시에서는 tag table을 topic으로 부터 분리했다.
  1. Cardinarity 확인
  • 테이블을 분리했을 때 각 table이 어떤 관계를 맺고있는지 확인해야한다.
  1. Cardinarity가 N:M이면 두 Table간 맵핑 Table을 만들어주고, 아니면 table만 분리한다.
  • 예시에서 하나의 topic은 여러개의 tag를 가질 수 있다. title은 rdb, free등 2개 이상의 tag를 가짐
  • 하나의 tag는 여러개 topic을 가질 수있다. rdb는 MYSQL에도, ORACLE에서 사용된다.

Topic Table

Mapping Table

Tag Table

장점

  • 데이터의 수정, 삭제, 삽입 연산에 이상 문제 방지
  • 데이터 구조가 단순해지고 명확해진다

📌 제 2 정규화

제 1 정규화에서 참고했던 자료들이 제2, 제3 정규화에서 다소 오해를 불러일으킬 수 있어
제 2 정규화부터는 다른 자료를 참고하여 글을 썼다.

하나의 테이블에 복합키 결정자가 있을 때, 복합키의 부분집합이 결정자가 되면 안된다. 따라서 복합키의 부분집합 결정자 부분과 종속되는 일반 속성을 다른 하나의 테이블로 분리해주는 과정이다.

쉽게 설명하면, 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업이다.

제 2 정규화 적용 전

해당 예시에서 기본키는 (학생번호, 강좌이름)으로 복합키라는 것을 알아두자.

  • 성적은 (학생번호, 강좌이름) 복합키에 종속된다.
    (학생번호, 강좌이름) --> (성적)

  • 강의실은 복합키의 부분집합인 (강좌 이름)에 종속된다.
    (강좌이름) --> (강의실)

즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름이 결정자이기 때문에 위의 테이블의 경우 다음과 같이 기존의 테이블에서 강의실을 분해하여 별도의 테이블로 관리하여 제2 정규형을 만족시킬 수 있다.

발생하는 단점

단점 1. 하나의 테이블에 강좌이름, 강의실 데이터가 중복으로 들어가고 있다.


제 2 정규화 적용 후

제2 정규형을 적용 대상인 수강강좌 Table에 제2 정규화를 적용하여 수강, 강의실 2개의 table로 나누었다.
이제 수강 Table 내 복합키 부분집합에 종속되는 일반 속성은 존재하지 않는다.

장점

  • 더 이상 강좌이름과, 강의실 데이터가 중복으로 들어가지 않게 된 것을 확인할 수 있다.

📌 제 3 정규화

제2 정규화를 완료한 테이블에서, 이행적 함수 종속성을 제거하는 과정이다.
이행적 종속이라는 것은 A -> B, B -> C가 성립할 때 A -> C가 성립되는 것을 의미한다.

쉽게 말하면 주식별자가 아닌 모든 속성 간에는 서로 종속될 수 없는 것이다.

제 3 정규화 적용 전

테이블에서 학생 번호는 강좌 이름을 결정하고 있고, 강좌 이름은 수강료를 결정하고 있다. 그렇기 때문에 이를 (학생 번호, 강좌 이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해해야 한다.

강좌이름은 학생번호에 종속된다.
(학생번호) --> (강좌 이름)

수강료는 강좌이름에 종속된다.
(강좌이름) --> (수강료)

발생하는 단점

단점 1. 501번 학생이 강좌를 자료구조로 변경하고 싶을 때 수강료를 따로 20000원으로 수정해야하는 번거로움이 있음


제 3 정규화 적용 후

제 3 정규형 적용 대상인 계절학기 Table에 제3 정규화를 적용하여 계절수강, 수강료 2개의 Table로 나누었다.
이제 계절수강 Table 내 주식별자가 아닌 다른 일반 속성에 종속되는 값은 없다.


참고자료

애플코딩: 정규화

hyun: 단계별 정규화 정의

망나니 개발자: 정규화 정의

ASAC 04 애런: 정규화 정의

profile
반복되는 실수를 기록을 통해 줄여가보자!

0개의 댓글