본문 바로가기
데이터베이스/이론및실습

정규화

by 베어그릴스 2022. 12. 22.
반응형

[ 정규화(Normalization)이란? ]

정규화(Normalization)의 기본 목표는 테이블 간에 중복된 데이터를 허용하지 않는다는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성(Integrity)를 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다.

이러한 테이블을 분해하는 정규화 단계가 정의되어 있는데, 여기서 테이블을 어떻게 분해되는지에 따라 정규화 단계가 달라지는데, 각각의 정규화 단계에 대해 자세히 알아보도록 하자. 

 

최대한 전문용어를 제외하고 간단하게 설명.

구민회관 체육센터 개발자이다.

기존에는 엑셀로 명단을 관리하였지만 회원수가 늘어나면서 더 이상 엑셀로 관리가 안되어

DB로 관리해야할 필요가 생김

회원번호 회원이름 프로그램
101 박지성 수영초급
102 손흥민 헬스
103 호나우도 수영중급

 

Q. 103번 호나우도가 골프도 등록하면?

회원번호 회원이름 프로그램
101 박지성 수영초급
102 손흥민 헬스
103 호나우도 수영중급,골프

단점 1. 골프초급 수강신청한 사람 찾기 귀찮아짐

where 프로그램 LIKE '%골프초급%';

 

단점 2. 프로그램명 수정도 어려워짐

 

제1 정규화

한 칸엔 하나의 데이터만

회원번호 회원이름 프로그램
101 박지성 수영초급
102 손흥민 헬스
103 호나우도 수영중급
103 호나우도 골프

 

제1 정규화해놔야 나중에 문제없음

 

제2 정규형 / 제2정규화

 

수강등록현황 테이블

 

Q. 헬스 가격을 40,000원으로 수정하려면?

 

아래와 같이 헬스를 등록한 4개의 회원에 대한 가격을 수정해야 한다.(회원이 많을수록 고쳐야 할 값 증가함)

회원번호 회원이름 프로그램 가격 납부여부
101 박지성 수영초급 43,000 Y
102 손흥민 헬스 35,000 N
103 호나우도 수영중급 43,000 Y
103 호나우도 골프 80,000 N
104 홍길동 헬스 35,000 Y
105 어쩌구 헬스 35,000 Y
106 저쩌구 헬스 35,000 Y

 

현재 테이블의 주제와 관련 없는 칼럼을 다른 테이블로 뺀다.

 

가격은 현재 테이블 주제랑 별 상관없다.

 

프로그램 TABLE

프로그램코드 프로그램명 가격
0001 수영초급 43,000
0002 수영중급 43,000
0003 헬스 35,000
0004 골프 80,000

 

Q. 헬스 가격을 40,000원으로 수정하려면?
프로그램 테이블의 헬스 가격만 인상하면 전체적으로 변경된다.

 

[프로그램]

프로그램코드 프로그램명 가격
0001 수영초급 43,000
0002 수영중급 43,000
0003 헬스 40,000
0004 골프 80,000

 

[수강등록현황]

회원번호 회원이름 프로그램코드 납부여부
101 박지성 0001 Y
102 손흥민 0003 N
103 호나우도 0002 Y
103 호나우도 0004 N
104 홍길동 0003 Y
105 어쩌구 0003 Y
106 저쩌구 0003 Y

Q. 홍길동은 얼마 내야 함?

1개의 테이블만 봐서는 모르기 때문에 프로그램 테이블을 조인하여 사용한다.

 

정의 : partial dependency를 제거한 테이블

 

Composite primary key

 

수강등록현황의 회원번호는 primary key이며 유니크하다.

행을 서로 구분하기 위한 유니크한 칼럼이다.

 

아래는 Primary key의 역할이 없을 때다.

회원번호 회원이름 프로그램 가격 납부여부
101 박지성 수영초급 43,000 Y
102 손흥민 헬스 40,000 N
103 호나우도 수영중급 43,000 Y
103 호나우도 골프 80,000 N

 

대신 Composite primary key라는 게 있다.

 

회원번호 / 프로그램

회원번호는 중첩됐지만 프로그램은 중복되지 않는다.

 

두 개의 키를 합치면 primary key 역할 가능

이런 칼럼들을 Composite primary key라 한다.

 

제2 정규형의 정의를 다시 보자

partial dependency를 제거한 테이블

 

가격은 프로그램에 종속돼있다.

partial dependency

(하나의 composite primary key에 종속)

 

제3 정규형

program 테이블

 

아래는 2 정규형 프로그램 테이블이다.

프로그램코드 프로그램명 가격 강사 출신대학
0001 수영초급 43,000 머스크 서울대
0002 수영중급 43,000 이철수 광운대
0003 헬스 40,000 김택진 중앙대
0004 골프초급 80,000 노상식 연세대
0005 골프중급 85,000 노상식 연세대

위 테이블도 문제가 되는 부분이 강사의 이름과 출신대학을 변경해야 할 때 2 군대를 수정해줘야 한다는 것이다.

 

일단 제2 정규형이다.

composite primary key들 없다.

 

Primary key 하나만 있다. 프로그램코드

하지만 강사와 출신대학은 프로그램과 별 상관없으며, 출신대학은 강사에 종속된다.

 

제3 정규화 : 일반 칼럼에만 종속된 칼럼은 다른 테이블로 빼기

 

[프로그램]

프로그램코드 프로그램명 가격 강사코드
0001 수영초급 43,000 001
0002 수영중급 43,000 002
0003 헬스 40,000 003
0004 골프초급 80,000 004
0005 골프중급 85,000 005

[강사]

강사코드 강사 출신대학
001 머스크 서울대
002 이철수 광운대
003 김택진 중앙대
004 노상식 연세대

위 모두 제3 정규형을 만족한다.

 

그렇다면 최종 적인 테이블은 아래와 같이 완성된다.

[수강등록현황]

회원번호 회원이름 프로그램코드 납부여부
101 박지성 0001 Y
102 손흥민 0003 N
103 호나우도 0002 Y
103 호나우도 0004 N
104 홍길동 0003 Y
105 어쩌구 0003 Y
106 저쩌구 0003 Y

[프로그램]

프로그램코드 프로그램명 가격 강사코드
0001 수영초급 43,000 001
0002 수영중급 43,000 002
0003 헬스 40,000 003
0004 골프초급 80,000 004
0005 골프중급 85,000 005

[강사]

강사코드 강사명 출신대학
001 머스크 서울대
002 이철수 광운대
003 김택진 중앙대
004 노상식 연세대

위 테이블을 조인하여 사용하면 된다.

SELECT A.회원번호
     , A.회원이름
     , A.프로그램코드
     , B.프로그램명
     , B.가격
     , B.강사코드
     , C.강사명
     , C.출신대학
     , A.납부여부
  FROM 수강등록현황 A
  LEFT OUTER JOIN
       프로그램 B
    ON 1 = 1
   AND B.프로그램코드 = A.프로그램코드
  LEFT OUTER JOIN
       강사 C
    ON 1 = 1
   AND C.강사코드 = B.강사코드
 WHERE 1 = 1

 

완성

A.회원번호 A.회원이름 A.프로그램코드 B.프로그램명 B.가격 B.강사코드 C.강사명 C.출신대학 A.납부여부
101 박지성 0001 수영초급 43,00 001 머스크 서울대 Y
102 손흥민 0003 헬스 40,000 003 김택진 중앙대 N
103 호나우도 0002 수영중급 43,00 001 머스크 서울대 Y
103 호나우도 0004 골프초급 80,000 004 노상식 연세대 N
104 홍길동 0003 헬스 40,000 003 김택진 중앙대 Y
105 어쩌구 0003 헬스 40,000 003 김택진 중앙대 Y
106 저쩌구 0003 헬스 40,000 003 김택진 중앙대 Y

Q. 이 칼럼을 이 테이블에 보관해도 될까요?

- 위 정규화 규칙을 잘 따져보아요!

 

오늘도 보람찬 생존 ^.^

반응형

댓글