제1 정규형 / 제1 정규화
위와같이 회원들이 프로그램을 신청을 하였다고 가정한다.
김민수라는 사람이 골프 초급이라는 프로그램을 또 수강신청을 했다면 아래와 같이 표현할 수 있다.
위와같이 표현하면 단점이 생긴다.
1) 골프초급 수강신청한 사람 찾기 귀찮아진다.
골프초급을 찾을 때 WHERE 프로그램 = '골프초급' 이 아닌 WHERE 프로그램 LIKE '%골프초급%' 을 사용하는 등 귀찮아질 수 있다. 성능이 저항될 수도 있다.
2) 프로그램명 수정의 어려움
그래서 위와 같이 하나의 칸 안에는 하나의 데이터만 보관을 한다. 이것을 제1정규화라고 한다. 이처럼 작업이 완료된 테이블을 제1 정규형을 만족하는 테이블이라 부른다.
제2정규형 / 제2정규화
헬스를 신청한 회원 수가 1000명이라 가정하고 헬스 가격이 7000원으로 올라서 수정해야 한다고 가정한다.
가격 변경을 위해 6000원인 것을 찾아 다 수정을 해야 한다. 시간이 매우 오래걸린다. 이런 문제가 생기는 것이 싫으면 제2 정규화를 하면 된다.
제2 정규화 : 현재 테이블의 주제와 관련없는 컬럼을 다른 테이블로 옮겨주는(빼는) 작업
가격 컬럼을 생각해보면 현재 테이블의 주제랑 크게 상관이 없다. 왜냐하면 현재 테이블은 어떤 프로그램을 누가 등록했는지 저장을 하기 위한 테이블이지 프로그램 가격을 소개하는 테이블이 아니다. 그래서 가격 컬럼은 현재 테이블의 주제와 맞지 않기 때문에 다른 테이블로 빼버리면 된다.
프로그램 테이블 하나 만들어서 가격을 따로 기록해둔다. 이 작업을 제2 정규화라고 한다. 작업이 완료된 테이블을 제2 정규형이라고 부른다. 이렇게 수정을 하면 헬스 가격을 수정할 때 한 곳만 수정하면 된다는 장점이 있다. 장점이 있다면 단점도 있다. 손흥민이라는 사람이 얼마를 내야 되는지 조회하고 싶으면 수강등록현황 테이블 안에서는 볼 수 없다. 다른 테이블에 있던 데이터를 끌고 와야 이 사람이 얼마를 내야 되는지 알 수 있게 된다. 그래서 나중에 데이터를 SELECT로 조회할 때 귀찮은 점이 발생할 수 있다. (그래서 비관계형 데이터베이스들은 정규화 같은 이런 것들을 안 하는 경우들이 많다.)
제2정규형의 정확한 정의 : partial dependency를 제거한 테이블
partial dependency를 쉽게 알기 위해 개념 하나만 짚고 넘어가자
Composite primary key 라는 표현이 있다. 먼저 primary key는 행을 서로 구분하기 위한 유니크한 데이터를 담고있는 컬럼을 뜻한다.
아래와 같이 primary key 컬럼이 없는 경우에도 primary key를 정해 둘 수 있다. 이 테이블에서 회원 번호와 프로그램을 합치면 primary key 역할 같은 것을 하게 할 수 있다. 이것을 Composite primary key 라고 부른다. 꼭 2개가 아닌 3개, 4개 이상 합쳐도 상관없다.
테이블을 보면 가격 컬럼이 프로그램 컬럼에 종속되어 있다. 왜냐하면 프로그램에 따라서 가격이 결정 되기 때문이다. 하나의 Composite primary key에 종속되어 있는 경우 partial dependency가 있다고 표현한다. 결론적으로 partial dependency가 잇는 컬럼을 다른 테이블로 빼 버리면 제2 정규화가 완성이 되는 것이다.
쉽게 이야기 해서 제2 정규화를 하고 싶으면 현재 테이블에 메인 주제랑 상관없는 컬럼을 다른 테이블로 빼면 된다고 이해하면 된다.
제3 정규형 / 제3정규화
위 테이블은 제2 정규형 테이블 이다. 왜냐하면 컴포지트 프라이머리 키가 없기 때문에 파셜 디펜던스도 없다. 단순히 프라이머리 키 역할을 하는 프로그램 컬럼만 있을 뿐이다.
여기서 출신대 컬럼은 프라이머리 키랑 전혀 상관이 없고 강사 컬럼에만 종속이 되어 있다.
이런 식으로 일반 컬럼에만 종속된 컬럼을 다른 테이블로 빼 버리면 이것을 제3 정규화라고 한다. 이 작업이 완료된 테이블을 제3정규형이라고 한다. 장점은 나중에 수정이 편리해 진다.
이상구라는 사람이 서울대 대학원에 들어가서 고려대를 서울대로 수정해야한다고 가정한다면 제2정규화까지 해 놓았다면 두 군데를 각각 수정해야한다. 현재는 두 군데 이지만 수가 늘어나면 일일히 수정을 해주어야 한다.
제3 정규화를 해놓았다면 수정할 곳은 한곳밖에 없게 된다.
단점은 이상구라는 사람의 학력이 궁금하다면 teacher 테이블에 가서 데이터를 끄집어 와야 한다.
하지만 관계형 데이터베이스는 보통은 제3 정규화까지 해 놓는 경우가 많다.
참고
https://www.youtube.com/watch?v=Y1FbowQRcmI&ab_channel=%EC%BD%94%EB%94%A9%EC%95%A0%ED%94%8C
'개발 관련 강의 정리 > 유튜브' 카테고리의 다른 글
[드림코딩] 정규표현식 , 더이상 미루지 말자 🤩 정리 (0) | 2023.07.09 |
---|---|
[코딩애플 ]개발자 90%가 모르는 자바스크립트 동작원리 (Stack, Queue, event loop) 정리 (0) | 2023.07.08 |
[드림코딩] 마크다운(Markdown) 6분 순삭 정리 + 깃허브 리드미(ReadMe) 파일 작성 팁 정리 (0) | 2023.07.07 |
[개발자 허니비Honeybee] 내가 공부하려고 만든 기술면접 질문/답변 모음 JAVA편 정리 (0) | 2023.07.04 |
[영카데미] API이해 및 API문서 보는법 정리 (0) | 2023.07.03 |
댓글