제 1정규화 : "한 칸엔 하나의 데이터만" => 제 1 정규형 테이블
제 2정규화 : "현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 빼는 작업"
위의 테이블에서 "가격 컬럼"은 현재 테이블 주제와 별 상관이 없다.
따라서, 프로그램 테이블이라고 따로 빼서 테이블을 만들 수 있다. (아래 확인)
수강등록현황 테이블, 프로그램 테이블 => 제 2정규형을 만족하는 테이블
장점)
프로그램의 댄스 가격을 수정한다고 한다면, 수강등록 현황 테이블에서 수강회원들의 댄스 프로그램의 가격을 모두 수정하는 번거로움 없이, 프로그램 테이블에서 댄스 프로그램의 가격만 변경해주면 된다.
=> 수정의 간편화
단점)
회원 한명이 얼마를 내야하는지 궁금할때, 수강등록 현황 테이블만 봐서는 모른다. 프로그램 테이블의 정보를 같이 끌고와야 조회가 가능하다는 불편함이 있다.
따라서, 비관계형 DB들은 정규화를 안하는 경우가 많다.
=> 제 2정규형의 정확한 정의 : "partial dependency를 제거한 테이블"
# partial dependency 란?
composite primary key
primary key가 없는 테이블에는 대신 composite primary key가 있다. 컬럼 여러개를 합치면(2개이상) 유니크한 속성이 생겨 primary key 역할이 가능해지게 되는데, 이때 이 컬럼들을 composite primary key라고 한다.
한마디로 composite primary key는 합하면 primary key가 되는 컬럼들을 말한다.
그렇다면 partial dependency 는 무엇이냐하면,
composite primary key에 종속되는 컬럼이 있는데 이때, 이 컬럼은 composite primary key에 partial dependency가 있다고 표현한다. 그래서 이 partial dependency가 있는 컬럼을 다른 테이블로 빼면 제 2정규화가 완성되는것이다.
제 3정규형 : "일반컬럼에만 종속된 컬럼을 다른 테이블로 빼는 작업"
여기서 프로그램 테이블은 제 2정규형 테이블이다. composite primary key가 없기 때문에 partial dependency도 없다. 그냥 primary key 인 프로그램명 하나만 있다.
여기서 "출신대학" 컬럼을 주목하면 primary key인 프로그램명과 전혀 상관이 없다. 이 컬럼은 "강사"라는 일반컬럼에 종속이 된 컬럼이다.
이렇게 일반 컬럼에만 종속된 컬럼을 다른 테이블로 빼버리면 그것을 제 3정규화라고 한다.
그리고 이렇게 작업이 완료된 테이블을 제 3정규형이라고 한다.
위의 프로그램 테이블, 강사테이블은 제 3정규형을 만족하는 테이블이다.
장점)
수정이 편리하다.
예를들면 위의 테이블에서 전정국이라는 강사의 출신대학이 변경되었을때 제 2정규형에서는 만약 해당 강사가 맡은 프로그램이 엄청 많을때 하나하나 고치기에는 귀찮고 불편하다. 하지만 제 3정규형을 만족하는 테이블에서는 해당 강사의 출신대학 한 곳만 바꿔주면 되기 때문에 수정이 편리하다.
단점)
제 2정규화와 마찬가지로 프로그램 테이블만으로는 해당 강사의 출신대학을 출력할 수 없고, 강사테이블의 내용까지 가져와야 한다는 귀찮음이 있다.
관계형 데이터베이스들은 보통 제 3정규화까지 해 놓는 경우가 많다.
참고