데이터베이스 정규화

민선규·2023년 2월 2일

데이터베이스

목록 보기
5/11
post-thumbnail

정규화

DB설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화라고 하며 정규화된 결과를 정규형이라고 한다.

정규화의 장점

  • DB변경시 이상현상을 제거할 수 있다.
  • 정규화된 DB 구조에서 새로운 데이터 형의 추가로 인한 확장 시, 그 구조에 대한 변경을 최소화 할 수 있다.

정규화의 단점

  • 릴레이션의 분해로 인해 릴레이션 간의 JOIN연산이 많아진다.
  • 데이터를 처리할 때 속도가 빨라질 수도 있고 느려질 수도 있다.

제 1정규형(1NF)

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

제 1정규화가 필요한 테이블

고객기업ID고객기업명주문번호
001A사101
002B사101, 102
003C사101, 102

제 1정규형 테이블

고객기업ID고객기업명주문번호
001A사101
002B사101
002B사102
003C사101
003C사102

제 1정규화가 필요한 테이블에서 B사와 C사같은 경우에는 주문번호가 101, 102처럼 단일값이 아니므로 테이블의 구조를 수정해야 한다.

제 1정규형을 하는 이유

  • 단일값이 아닌 경우에 값을 고유하게 특정할 수 없으므로 데이터의 정합성을 지킬 수 없다.

제 2정규형(2NF)

  1. 1정규형을 만족해야 한다.
  2. 모든 컬럼이 부분적 종속(Partial Dependency)이 없어야 한다. == 모든 칼럼이 완전 함수 종속을 만족해야 한다.

제 2정규화가 필요한 테이블

고객기업ID주문번호주문접수일고객기업명고객기업 규모
00110112/20A사대규모
00210112/25B사중규모
00210212/25B사중규모
00310112/27C사소규모
00310212/31C사소규모

제 2정규형 테이블

고객기업ID주문번호주문접수일
00110112/20
00210112/25
00210212/25
00310112/27
00310212/31

고객기업명고객기업 규모
A사대규모
B사중규모
B사중규모
C사소규모
C사소규모

제 2정규화가 필요한 테이블에서 기본키는 (고객기업ID+주문번호)이다. 주문접수일 (고객기업ID+주문번호)으로 값을 가져 올 수 있지만, 고객기업명과 고객기업 규모는 고객기업ID만으로도 값을 가져 올 수 있는 부분적 종속이 존재 하므로 테이블의 구조를 수정해야 한다.

제 2정규형을 하는 이유

  • 고객기업명이나, 고객기업 규모를 정확히 알지 못하는 경우에는 데이터를 추가할 수 없다.(불확실한 값에 NULL이나 더미 값을 넣는 것은 권장하지 않는다.)
  • 고객기업명과 고객기업 규모에 중복되는 값이 많으므로 잘못 추가하거나 수정 시 번거로운 문제가 있다.

제 3정규형(3NF)

  1. 2정규형을 만족해야 한다.
  2. 기본키를 제외한 속성들 간의 이행 종속성 (Transitive Dependency)이 없어야 한다.

제 3정규화가 필요한 테이블

고객기업ID고객기업명고객기업 규모업계코드업계명
001A사대규모201석유
002B사중규모202건설
002B사중규모202건설
003C사소규모203바이오
003C사소규모203바이오

제 3정규형 테이블

고객기업ID고객기업명고객기업 규모업계코드(FK)
001A사대규모201
002B사중규모202
002B사중규모202
003C사소규모203
003C사소규모203

업계코드업계명
201석유
202건설
202건설
203바이오
203바이오

제 3정규화가 필요한 테이블에서는 업계코드 -> 업계명 이행 종속성이 존재하므로 테이블의 구조를 수정해야 한다.

제 3정규형을 하는 이유

  • 제 2정규형을 하는 이유와 유사하다.

BCNF

  1. 3정규형을 만족해야 한다.
  2. 모든 결정자가 후보키 집합에 속해야 한다

BCNF가 필요한 테이블

학생번호과목지도교수
101JAVA김자바
102C++박플플
103JAVA오자바
104C#조씨샵
105JAVA김자바

BCNF 테이블

학생번호지도교수
101김자바
102박플플
103오자바
104조씨샵
105김자바

지도교수과목
김자바JAVA
박플플C++
오자바JAVA
조씨샵C#
김자바JAVA

(학생 번호, 과목)이 기본키로 지도교수를 알 수 있다. 하지만 같은 과목을 다른 교수가 가르칠 수도 있어서 과목-> 지도교수 종속은 성립하지 않는다. 그러나 지도교수가 어떤 과목을 가르치는지는 알 수 있으므로 지도교수-> 과목 종속이 성립하므로 테이블의 구조를 수정해야 한다.
이처럼 후보키 집합이 아닌 칼럼이 결정자가 되어버린 상황을 BCNF를 만족하지 않는다고 한다.

BCNF을 하는 이유

  • 제 3정규형을 하는 이유와 유사하다.

참고 문서 및 링크

0개의 댓글