[CS - 데이터베이스] DB 정규화란?

SUN·2022년 9월 26일
0

Computer Science

목록 보기
4/11

기술 면접을 진행을 하면서 CS개념들에 대한 질문을 받았을 때
분명 배웠는데 제대로 기억이 나지 않아서 답변을 제대로 못했다.

CS 공부에 소홀했다는 것을 반성하고 관련된 부분들에 대해 정리하면서 다시 공부해보려고 한다.
그 첫번 째는 DB 정규화가 무엇인 지에 대한 개념이다.

SQL에서 DB 정규화의 개념

이상현상이 있는 릴레이션(DB 테이블)을 분해하여 이상현상을 없애는 과정이다.

장점

  • 테이블 간에 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지하고 저장 용량을 줄일 수 있다.
  • 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발생할 수 있는 각종 이상현상(Anamolies)들을 방지할 수 있다.

단점
릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다

[제 1 정규화]

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

조건
1. 각 컬럼이 하나의 속성만을 가져야 한다.
2. 하나의 컬럼은 같은 종류나 타입(type)의 값을 가져야 한다.
3. 각 컬럼이 유일한(unique) 이름을 가져야 한다.
4. 칼럼의 순서가 상관없어야 한다.


ex)

추신수, 박세리의 경우에 여러개의 취미를 가지고 있기 때문에 원자성을 만족하지 못한다.

이렇게 변경을 해줘야 제 1 정규형를 만족한다.


[ 제2 정규화 ]

제 1 정규화가 진행된 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다.
여기서 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어선 안된다는 것을 뜻한다.

쉽게 말하면 어떤 테이블의 기본키가 복합키(두 개 이상의 컬럼으로 구성된 키) 일 때
기본키의 부분집합으로 인해 다른 컬럼의 값이 결정되어서는 안된다는 것이다.

조건
1. 1정규형을 만족해야 한다.
2. 모든 컬럼이 완전 함수 종속을 만족해야 한다.

ex)

이 테이블의 기본키는 {학생 번호, 강좌이름} 이라는 복합키이고 성적을 결정하고 있다.
그런데 여기서 '강의실' 컬럼은 기본 키의 부분집한인 {강좌이름}에 의해 결정될 수 있다.
이런 경우가 바로 기본키의 부분 집합(강좌이름)이 결정자(강의실을 결정)가 되는 경우이다.

그래서 이런 식으로 기존의 테이블에서 강의실을 분해해서 별도의 테이블을 만들어야 제 2 정규형을 만족 시킬 수 있다.


[제 3 정규화]

제 2 정규화를 진행한 테이블에 대해 이행적 종속이 없도록 테이블을 분해하는 것이다.
이행적 종속이란 A → B, B → C 가 성립할 때 A → C 가 성립하는 것을 의미한다.
삼단논법이라고 보면 되겠다.

ex)

위 테이블을 보면 학생 번호(A)는 강좌이름(B)을 결정하고 강좌 이름(B)은 수강료(C)를 결정한다.
결국 학생 번호(A)에 따라 수강료(C)가 결정되는 꼴이기 때문에 제 3 정규형을 만족하지 않는다.

이를 해결하려면 이런 식으로 (학생 번호, 강좌이름) 테이블과 (강좌 이름, 수강료) 테이블로 분해하면 된다.

++ 왜 이행적 종속을 제거해야 할까?

예를들어서 학생 번호가 501인 학생은 데이터 베이스 강좌를 수강할 것이고 수강료로 2만원을 지불할 것이다.

이 때 이행적 종속이 테이블에 존재한다면 501 학생이 수강할 강좌를 스포츠 경영학으로
변경한다면 원래 스포츠 경영학은 만 오천원인데, 2만원에 수강하게 되는 오류가 발생한다.

물론 수강료 컬럼도 같이 변경해줄 수도 있지만 이렇게 되면 번거롭다.


BCNF 정규화

제 3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.
여기서 결정자란 A → B 를 만족하는 A 를 의미한다.

참고로 후보키는 릴레이션을 구성하는 속성들 중에서
튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
또한 후보키는 유일성과 희소성을 만족 해야 한다.

유일성 : 하나의 키값으로 하나의 튜플만을 유일하게 식별할 수 있어야한다.
최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어 있어야한다.

이 테이블에서 기본키는 {학생 번호, 특강이름} 이고 교수를 결정하고 있다.
또한 교수는 특강 이름을 결정할 수 있다.

여기서 교수는 특강이름을 결정하는 결정자 이지만 후보키는 아니다.

이런 경우 데이터가 중복되고 김교수의 특강이름이 소셜네트워크의 이해로 바뀌었다면
두개의 row를 갱신해야 하는 문제가 있다.

따라서 이런식으로 테이블을 분리해서 관리해야 한다.


그니까 쉬운 말로 정리하자면

정규화는 테이블을 분리해서 이상 현상을 없애는 거라고도 할 수 있고 중복을 없애는 거라고도 할 수 있는 건데

제 1 정규화는 모든 컬럼이 하나의 값만 갖게 하는 거고
제 2 정규화는 거기다가 플러스로 기본키의 부분 집합이 결정자가 되면 안된다는 거고
제 3 정규화는 플러스로 a->b b->c일때 a->c도 만족하면 안된다는 거고
BCNF 정규화는 플러스로 결정자인데 후보키가 아닌게 있으면 안된다는 거다

참고 자료

profile
개발자

0개의 댓글