| 회원번호 | 회원이름 | 프로그램 |
|---|---|---|
| 101 | 강호동 | 스쿼시초급 |
| 102 | 손흥민 | 헬스 |
| 103 | 김민수 | 골프초급 |
위와 같은 예시에서 김민수라는 사람이 헬스를 추가 신청하였다.
| 회원번호 | 회원이름 | 프로그램 |
|---|---|---|
| 101 | 강호동 | 스쿼시초급 |
| 102 | 손흥민 | 헬스 |
| 103 | 김민수 | 헬스 |
| 103 | 김민수 | 골프초급, 헬스 |
만약 이렇게 등록한다면 나중에 각각의 데이터를 찾기가 어렵고, sql문을 작성할 때 like 문을 작성해야하기 때문에 성능이 저하될 수 있다. 프로그램 이름 수정할 때도 마찬가지이다. 따라서 제 1정규화를 진행하여야 한다.
"한 칸에 하나의 데이터만" - 제 1정규화
| 회원번호 | 회원이름 | 프로그램 |
|---|---|---|
| 101 | 강호동 | 스쿼시초급 |
| 102 | 손흥민 | 헬스 |
| 103 | 김민수 | 헬스 |
| 103 | 김민수 | 골프초급 |
위와 같은 테이블을 제 1정규형 테이블이라 한다.
쉽게 말하면 현재 테이블의 핵심 주제와 상관없는 컬럼을 제거하는 것이다. 밑의 예제로 알아보자.
수강 등록 현황 table
| 회원번호 | 회원이름 | 프로그램 | 가격 | 납부여부 |
|---|---|---|---|---|
| 101 | 강호동 | 스쿼시초급 | 5000 | 0 |
| 102 | 손흥민 | 헬스 | 6000 | 1 |
| 103 | 김민수 | 헬스 | 6000 | 1 |
| 103 | 김민수 | 골프초급 | 8000 | 0 |
프로그램마다 가격과 납부여부가 추가되었다. 만약에 헬스 가격이 7000원으로 수정되면 6000원을 모두 7000원으로 바꾸어주어야한다. 컬럼 수가 많으면 더 많은 시간이 걸린다. 이러한 불상사를 줄이기 위해 제 2정규화를 진행하여야 한다.
현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업 - 제 2정규화
가격 컬럼은 현재 수강 등록 현황 테이블과 주제 관계가 없다. 위 테이블은 회원들이 어떤 프로그램을 등록하였는지 저장하기 위한 테이블이다. 따라서 가격 컬럼을 다른 테이블로 뺄 수 있다.
수강 등록 현황 table
| 회원번호 | 회원이름 | 프로그램 | 납부여부 |
|---|---|---|---|
| 101 | 강호동 | 스쿼시초급 | 0 |
| 102 | 손흥민 | 헬스 | 1 |
| 103 | 김민수 | 헬스 | 1 |
| 103 | 김민수 | 골프초급 | 0 |
프로그램 table
| 프로그램 | 가격 |
|---|---|
| 스쿼시초급 | 5000 |
| 헬스 | 6000 |
| 골프초급 | 8000 |
위와 같은 테이블을 제2정규형을 만족하는 테이블이라 한다.
하지만 단점도 있다. 손흥민이 얼마를 내야하는지 알고 싶다면 현재 테이블을 제외하고 다른 테이블에서 데이터를 가져와야지 알 수 있다(Selete 시)
따라서 NoSQL처럼 비관계형 데이터베이스를 사용하는 경우도 있다. 비관계형 데이터베이스들은 정규화를 하지 않는다. 관계형 데이터베이스는 테이블을 정규화 해두는 것이 일반적이다.
제 2정규형의 정확한 정의는 partial dependency를 제거한 테이블이다. 밑의 예제를 통해 알아보자.
| id | 회원이름 | 프로그램 | 납부여부 |
|---|---|---|---|
| 101 | 강호동 | 스쿼시초급 | 0 |
| 102 | 손흥민 | 헬스 | 1 |
| 103 | 김민수 | 헬스 | 1 |
| 103 | 김민수 | 골프초급 | 0 |
알다싶이 첫번째 컬럼인 id가 primary key를 뜻하며 행을 구분하기 위해 만든 컬럼이다. 만약에 primary key 컬럼이 없다면 Composite primary key를 정의할 수 있다. 위의 테이블에서는 id와 프로그램명(Composite primary key)이 primary key 역할을 수행할 수 있다.
| 회원번호 | 프로그램 |
|---|---|
| 101 | 스쿼시초급 |
| 102 | 헬스 |
| 103 | 헬스 |
| 103 | 골프초급 |
따라서 두 개의 컬럼을 연결한다. 이때 이 컬럼 두개를 Composite Primary key라고 한다. 합하면 Primary key 역할을 할 수 있는 컬럼들이다.
| id | 회원이름 | 프로그램 | 가격 | 납부여부 |
|---|---|---|---|---|
| 101 | 강호동 | 스쿼시초급 | 5000 | 0 |
| 102 | 손흥민 | 헬스 | 6000 | 1 |
| 103 | 김민수 | 헬스 | 6000 | 1 |
| 103 | 김민수 | 골프초급 | 8000 | 0 |
Composite Primary Key에 종속된 컬럼이 있다. 예를 들어 가격 컬럼은 프로그램 컬럼에 종속되어 있다. 가격은 프로그램에 따라서 결정이 된다. 이처럼 하나의 Composite Primary key(column)에 종속되어 있으면 partial dependency가 존재한다고 판단한다.
따라서 partial dependency를 제거하면 제 2정규화가 완성된다.
제 3정규화는 일반 컬럼에만 종속된 컬럼은 다른 테이블로 빼기이다. 밑의 예제를 살펴보자.
| 프로그램 | 가격 | 강사 |
|---|---|---|
| 스쿼시 | 5000 | 김을용 |
| 헬스 | 6000 | 박덕팔 |
| 골프 | 8000 | 이상구 |
| 골프중급 | 9000 | 이상구 |
| 개인피티 | 6000 | 박덕팔 |
위는 컬럼은 partial dependency가 존재하지 않는다. 왜냐하면 composite primary key가 없기 때문이다. 따라서 primary 하나만 존재한다. 네번째의 출신대학은 primary key와 상관이 없다. 강사라는 컬럼에만 종속되어있다.
만약 이상구라는 사람의 대학이 서울대로 수정해야한다면 제 2정규형이 진행된 테이블에서는 강사가 모두 이상구인 사람을 서울대로 변경해야 한다. 따라서 데이터가 많아질수록 더 오래 걸리고, 여러곳을 수정해야한다. 따라서 제 3정규화가 필요하다.
program 테이블
| 프로그램 | 가격 | 강사 |
|---|---|---|
| 스쿼시 | 5000 | 김을용 |
| 헬스 | 6000 | 박덕팔 |
| 골프 | 8000 | 이상구 |
| 골프중급 | 9000 | 이상구 |
| 개인피디 | 6000 | 박덕팔 |
teacher 테이블
| 강사 | 출신대학 |
|---|---|
| 김을용 | 서울대 |
| 박덕팔 | 연세대 |
| 이상구 | 고려대 |
따라서 위처럼 테이블을 수정하면 제3정규형을 만족하는 테이블이 된다.