본문 바로가기

CS/CS지식

정규화와 비정규화

정규화란?

 

DB의 관계형 데이터베이스 논리적 설계 과정으로서 중복을 최소화 하는 프로세스라고 할 수 있다. 

즉, 데이터베이스 설계를 할 때 보다 효율적이고 조직된 관계의 테이블 쿼리를 작성하기 위해 참고하는 일종의 체크리스트이다.

 

 

정규화 과정

 

출처: https://velog.io/@bsjp400/Database-DB-%EC%A0%95%EA%B7%9C%ED%99%94-%EB%B9%84%EC%A0%95%EA%B7%9C%ED%99%94%EB%9E%80

 

 

위에서 아래 순서로 정규화를 체크해야하며 아래단계의 규형이 만족되지 않은 상태에서 다음 단계로 넘어갈 수는 없다. 보통 실무에선 3규형까지만 주로 많이 쓰이며 가끔 BCNF 개념이 나오는 형태로서 본 블로그에서는 BCNF까지만 설명하겠다.

 

1규형(원자값으로 테이블 구성)

 

1규형의 가장 중요한 포인트는 모든 속성이 "원자값"을 가져야한다는 것이다.

"원자값"이라는 의미는 더이상 분리가 되지않을 정도라는 것을 의미하는데 데이터 베이스의 원자값이란 표현은 몹시 포괄적 표현으로서, 여기선 한개의 값 이라는 직관적 단어를 사용하겠다.

 

 

*주문

 

주문번호 주문일 회원ID 회원명 회원등급 상품ID 단위 수량 단가
1 20130505 KIM 김자바 일반 H301
K22
H40
NET
PACKET
3-PACK
30
3
495
40000
30000
20000
2 20194931 HONG 홍길동 우수 A101 6-PACK 4 10000

 

이런 표가 있다고 가정하였을 때 주문번호 1 김자바는 1규형을 위반하였고 주문번호 2 홍길동은 1규형을 지켰다.  즉, 1규형이 말하는 한개의 값이란 하나의 속성에 여러가지 값을 가지는 것이 불가능 하다는 것이다.

1규형을 만족시키기 위해선 주문번호를 기준으로 주문과 주문상세 테이블로 나누어야한다.

 

 

*주문

 

주문번호 주문일 회원ID 회원명 회원등급
1 20130505 KIM 김자바 일반
2 20194931 HONG 홍길동 우수

 

*주문상세

 

주문번호 상품ID 단위 수량 단가
1 H301 NET 30 40000
1 K22 PACKET 3 30000
1 H40 3-PACK 495 20000
2 A101 6-PACK 4 10000

 

2규형(부분적 함수 종속 제거)

 

위의 테이블은 하나의 속성이 여러개의 값을 가지는 것을 피하기 위해 주문번호는 기본키이기도 하면서 복합키가 되어 두개의 테이블에 종속되었다.

 

그런데 여기서 주문상세 테이블은 1정규형은 만족할 순 있지만 2정규형은 만족하지 않는다.

2규형은 모든 함수는 완전한 함수적 종속을 이루어야한다는 규정이 있다. 

 

함수적 종속이란, X의 값을 알면 Y의 값을 바로 식별할 수 있고 X의 값에 따라 Y의 값이 달라질 때 Y는 X에 종속되었다라고 한다. 이런 개념을 바탕으로 부분 함수적 종속이란, 밑의 3가지를 의미한다.

 

  • Y의 값이 기본키가 아닌 다른 속성에 종속
  • 기본키가 여러 속성으로 구성
  • 기본키를 구성하는 속성 중 일부만 종속

다시 주문상세 테이블로 설명을 하자면 우리는 수량을 알기 위해선 주문번호와 상품ID를 모두 알고있어야지만 수량을 알 수 있다. 주문번호 1만으로는 어떤 상품의 수량인지를 알지 못하는 것이고 상품ID만 가지고서는 어떤 회원이 주문한 수량인지를 알 수 없는 것이다.  그런데 상품ID만으로는 단위와 단가를 알 수 있다. 

 

 

 

그렇기에 이 역시 테이블을 두개로 나누어야만 1유형과 2유형을 모두 만족하는 테이블이 되는 것이다.

 

상품ID 단위 단가
H301 NET 40000
K22 PACKET 30000
H40 3-PACK 20000
A101 6-PACK 10000

 

주문번호 상품ID 수량
1 H301 30
1 K22 3
1 H40 495
2 A101 4

 

 

이번엔 주문 표를 가지고 설명을 해보겠다. 

주문 표를 보면 1유형도 만족하며 2유형도 만족하는 테이블이다.

그러나 3유형을 만족하지 못하는 이유는 주문번호를 알면 회원 ID와 회원명 회원등급을 모두 알 수 있듯이 회원 ID를 알면 회원명과 회원등급도 알 수 있기 때문이다. 

 

 

 

 

즉, A -> B로만 되어 데이터의 흐름이 끝나야하는데 A -> B -> C까지 이어짐으로서 3유형이 만족하지 못하는 것이며 이를 이행적 함수 종속이 되지않았다 라고 하는 것이다. 이를 위해선 역시 테이블을 한번 더 분리시켜야한다. 

 

주문번호 주문일 회원ID
1 20130505 KIM
2 20194931 HONG

 

회원ID 회원명 회원등급
KIM 김자바 일반
HONG 홍길동 우수

 

회원명으로 회원등급을 알 수 있다고 할 수는 있지만 회원명은 중복불가속성을 논리적으로 가질 수 없기에 회원이 많아질 경우 이를 통해 회원등급을 확인할 수 없다. 즉, 해당 테이블은 1,2,3유형을 모두 만족하는 테이블이다.

 

BCNF(결정자이면서 후보키가 아닌 것을 제거)

 

BCNF는 3.5규형이라고도 할 수 있고 강한 3규형이라고도 할 수 있다. 

 

학번 과목명 교수
100 데이터베이스 P01
100 자료구조 P02
200 데이터베이스 P01
200 자료구조 P03
300 자료구조 P03
100 데이터베이스 P04

 

위 테이블은 학생 한명이 여러개의 과목을 들을 수 있고 교수는 특정 한 과목만 수업할 수 있으나 해당 과목을 가르치는 교수는 한명이 아닌 복잡한 구조의 테이블이다.

즉, 학번 100의 학생은 데이터베이스와 자료구조 과목을 들을 수 있는데 이 때 이 학생은 P01과 P04 교수의 데이터베이스 수업 중 하나를 선택할 수 있는 것이다. 

 

즉, 이는 학번과 과목며잉 묶여 기본키가 되어야지만 교수를 알 수 있는 테이블이다. 그러나 여기서 문제는 교수를 알면 과목명도 알 수 있다는 것이 문제이다.

학번+과목명 => 교수 뿐만 아니라 교수 => 과목명 의 개념도 성립되는 것이다. 

 

 

즉, 이를 BCNF를 만족하지 못했다고 하며 이 역시 테이블을 쪼개야하는 기준이다.

 

교수 과목명
P01 데이터베이스
P02 자료구조
P01 데이터베이스
P03 자료구조
P03 자료구조
P04 데이터베이스

 

학번 교수
100 P01
100 P02
200 P01
200 P03
300 P03
100 P04

 

 

단, 이는 BCNF는 아주 특이한 경우에 발생되어 실무에선 크게 많이 발생되지는 않는다.

 

 

무손실분해의 원칙

 

이렇게 분리한 테이블을 조인했을 때 본래의 테이블에 가지고 있었던 값이 손실되지않고 그대로 정상적으로 출력되어야함을 의미한다.

 

 

반정규화란?

 

정규화된 데이터 모델을 의도적으로 통합, 중복, 분리하여 정규화 원칙을 위배하는 행위를 뜻한다.

 

우리는 DB 테이블을 생성할 때 관리 측면과 성능&효율을 모두 생각해야만 한다.

그러나 정규화만 지켜 테이블을 만들게 된다면 여러개의 테이블로 분해시켜두었기에 우리는 조인을 여러번, 자주 해야할 상황이 생길 것이고 조인을 많이 하면 할 수록 성능과 효율은 필수적으로 낮아진다.

즉, 정규화는 데이터들을 관리하는 측면에서만 좋은것이다. 

이에 실무에서는 우선 정규화를 시켜두고 성능을 체크한 후 성능이 안좋으면 일부분을 반 정규화 시키는 방향가야한다. 그러나 과도한 반 정규화는 오히려 성능을 저하시키고 데이터의 일관성이 저하될 수 있기 때문에 적정선을 반드시 유지해야한다.

 

 

반정규화 방법

 

테이블 통합 두개의 테이블이 조인되어 사용되는 경우가 많을 경우 성능향상을 위해 하나의 테이블로 통합해 만들어 사용한다.
테이블 분할 행을 기준으로 테이블을 분할할 것인지 열을 기준으로 테이블을 분할할 것인지를 구분한다.
중복테이블 추가 여러 테이블에서 데이터를 추출해서 사용하는 경우 혹은 다른 서버에 저장된 테이블을 이용해야하는 경우에 작업의 효율성을 향상시키기 위해서 테이블을 추가한다.
중복속성추가 조인해서 데이터를 처리할 때 데이터를 조회하는 경로를 단축하기 위해 자주 사용하는 속성을 하나 더 추가한다.

 

 

 

*Reference

 

https://www.youtube.com/watch?v=RXQ1kZ_JHqg

https://www.youtube.com/watch?v=9GTRsrs8U6E

'CS > CS지식' 카테고리의 다른 글

의존관계 주입이란?  (0) 2024.12.10
DB의 프로시저란?  (0) 2022.08.15
HTTP란?  (0) 2022.05.25
객체지향 프로그램이란?  (0) 2022.05.25