[ 정규화(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. 이 칼럼을 이 테이블에 보관해도 될까요?
- 위 정규화 규칙을 잘 따져보아요!
오늘도 보람찬 생존 ^.^
댓글