목차
전제
테이블 설계를 하면서 늘 어떤식으로 하는게 제일 깔끔할지 고민을 많이 했었는데, 정규형과 관련된 정리 중 가장 쉽고 깔끔하게 정리된 영상을 보고 간단하게 메모해둔다.
학생번호 | 이름 | 수강과목 |
101 | 홍길동 | 수학 |
102 | 강감찬 | 영어 |
103 | 손오공 | 영어 |
제 1 정규형 / 제 1 정규화
만약 103 손오공 학생이 국어 과목을 추가로 수강신청한다면?
학생번호 | 이름 | 수강과목 |
101 | 홍길동 | 수학 |
102 | 강감찬 | 영어 |
103 | 손오공 | 영어, 국어 |
위와 같은 방식으로 데이터가 추가된다면 다음과 같은 문제가 발생하게 된다.
1. 국어만 수강신청한 사람을 찾기 귀찮아진다
where 수강과목 = '국어' 가 아닌, where 수강과목 like '%국어%' 로 조건문을 사용해야할 수도 있음..!
2. 과목명을 수정할때 귀찮아질 수 있다.
따라서 아래와 같이 데이터를 보관하는게 좋다.
학생번호 | 이름 | 수강과목 |
101 | 홍길동 | 수학 |
102 | 강감찬 | 영어 |
103 | 손오공 | 영어 |
103 | 손오공 | 국어 |
하나의 칸 안에는 하나의 데이터만 보관하도록 하는것을 제 1 정규화라고 한다.
그리고 작업이 완료된 테이블을 제 1 정규형을 만족하는 테이블이라고 부른다.
따라서 제 1 정규형을 만족시키는 식으로 데이터를 저장해야 추후 문제가 발생하지 않는다.
제 2 정규형 / 제 2 정규화
테이블에 컬럼을 조금 추가해보자.
학생번호 | 이름 | 수강과목 | 수업시간 | 최근수업참여여부 |
101 | 홍길동 | 수학 | 1 | F |
102 | 강감찬 | 영어 | 2 | T |
103 | 손오공 | 영어 | 2 | T |
103 | 손오공 | 국어 | 4 | F |
만약 영어 수업의 수업시간이 3시간으로 변경된다면??
당장 위의 테이블에선 102번과 103번 학생 두개의 행만 바꿔주면 된다.
하지만, 영어를 수강하는 학생이 수백, 수천 많게는 수만명으로 늘어난다면?
변경해야하는 행의 수가 그만큼 늘어나게 된다.
이런 불상사가 발생하지 않으려면 제 2 정규화를 하면 된다..!
제 2 정규화는 현재 테이블의 주제와 관련이 크게 없는 컬럼들을 다른 테이블로 옮겨두는것이다.
위 테이블을 보면, 수업시간 컬럼은 테이블의 주제와 별 상관이 없는것을 확인할 수 있다.
어떤 학생이 어느 수업을 듣는지에 대한 테이블이지, 각 수업의 수업시간을 알려주는 테이블이 아니다.
따라서, 수업시간 컬럼을 다른 테이블로 빼버리면 되는 것이다.
학생번호 | 이름 | 수강과목 | 최근수업참여여부 |
101 | 홍길동 | 수학 | F |
102 | 강감찬 | 영어 | T |
103 | 손오공 | 영어 | T |
103 | 손오공 | 국어 | F |
수강과목 | 수업시간 |
수학 | 1 |
영어 | 2 |
국어 | 4 |
위와 같은 작업을 제 2 정규화 라고 하고, 이 작업이 완료된 테이블을 제 2 정규형 테이블이라고 부른다.
다시 영어 수업의 수업시간을 변경해보자.
두번째 테이블의 행 하나만 수정하면 되는것을 볼 수 있다..!
SELECT문을 사용할 경우, 여러 테이블을 JOIN 하느라 쿼리가 복잡해질 수 있다는점이 단점으로 작용할 수 있다.
위의 비관계형 DB들은 정규화를 하지 않는 경우가 많다. (-> 단점을 감수하고 사용)
하지만, 관계형 데이터베이스들은 제 2 정규화를 해 놓는게 좋다.
제 2 정규형은 Partial Dependency를 제거한 테이블 이라고도 말할 수 있다.
(= 현재 테이블의 핵심주제와 상관없는 컬럼을 제거)
Partial Dependency?
Composite primary key 개념을 먼저 짚고 넘어가자.
학생번호 | 이름 | 수강과목 | 최근수업참여여부 |
101 | 홍길동 | 수학 | F |
102 | 강감찬 | 영어 | T |
103 | 손오공 | 영어 | T |
103 | 손오공 | 국어 | F |
위 테이블에서처럼 완전 유니크한 Primary Key 역할의 컬럼이 없는 경우에도 Primary Key를 정해 둘 수 있다.
그걸 Composite primary key 라고 부르는데, 위 테이블에서 학생번호 컬럼과 수강과목 컬럼 둘을 묶으면 Primary Key 처럼 사용할 수도 있을것이다..!
학생번호 | 수강과목 |
101 | 수학 |
102 | 영어 |
103 | 영어 |
103 | 국어 |
위처럼 키를 두 행을 합쳐 구성하면, 각각의 행이 유니크함을 볼 수 있다.
다시말해, 합하면 Primary Key 역할을 할 수 있는 컬럼들을 Composite primary key 라고 표현할 수 있다. (2개 이상)
그럼 다시 돌아와서, Partial Dependency 가 뭐냐하면 Composite primary key 에 종속된 컬럼을 말하는 것이다.
학생번호 | 이름 | 수강과목 | 수업시간 | 최근수업참여여부 |
101 | 홍길동 | 수학 | 1 | F |
102 | 강감찬 | 영어 | 2 | T |
103 | 손오공 | 영어 | 2 | T |
103 | 손오공 | 국어 | 4 | F |
위 테이블을 보면 수업시간 컬럼이 그렇다고 볼 수 있겠다...!
수업시간 컬럼은 수강과목에 따라서만 결정이 되니까!
이런식으로 하나의 컬럼, Composite key에 종속이 되어 있는 경우, Partial Dependency가 있다고 본다.
그리고, 해당하는 컬럼을 걷어내는 경우, 제 2 정규화가 완성이 되는 것이다.
제 3 정규형 / 제 3 정규화
수강과목마다 어떤 교수가 가르치는지, 그 교수는 어느 대학 출신인지를 나타내는 컬럼이 추가하였다.
수강과목 | 수업시간 | 강사이름 | 출신대학 |
수학 | 1 | 헌석원 | 서울대 |
영어 | 2 | 이멍학 | 연세대 |
국어 | 4 | 한슥봉 | 고려대 |
위 테이블에서 출신대학 컬럼을 주목해보자.
출신대학은 테이블의 PK인 수강과목과 전혀 상관이 없고, 강사이름 컬럼에만 종속이 되어있다.
이런 컬럼을 아래처럼 다른 테이블로 빼버리면 제 3 정규화 라고 하고, 이런 테이블을 제 3 정규형이라고 한다.
수강과목 | 수업시간 | 강사이름 |
수학 | 1 | 헌석원 |
영어 | 2 | 이멍학 |
국어 | 4 | 한슥봉 |
강사이름 | 출신대학 |
헌석원 | 서울대 |
이멍학 | 연세대 |
한슥봉 | 고려대 |
역시 수정해야하는 행이 줄어들어 성능상 장점이 있다.
그리고 역시 여러 테이블을 조인해야하는 단점도 있을 것이다.
귀찮지만 관계형 데이터베이스들은 제 3 정규화까지 해두는 경우가 많다...!
'DB' 카테고리의 다른 글
[Oracle] 오라클 아키텍처 : 데이터베이스와 인스턴스 (1) | 2023.05.06 |
---|---|
[Tibero] 티베로 아키텍쳐 (0) | 2023.05.03 |
[MSSQL] SQL Server 튜닝 - 조인 (0) | 2023.01.04 |
[MSSQL] SQL Server 튜닝 - 실행 계획 (0) | 2022.12.27 |
[MSSQL] SQL Server 튜닝 - 인덱스 (0) | 2022.12.20 |
댓글