3NF
제3정규형(3rd normal form)
제2정규형을 만족하는 테이블에서 primary key 또는 composite primary key 컬럼에 종속된게 아닌
하찮은 잔챙이 컬럼에 종속된 컬럼을 다른 테이블로 빼면
그게 제3정규형 테이블입니다.
프로그램
가격
강사
출신대학
스쿼시
5000
김을용
서울대
헬스
6000
박덕팔
연세대
골프
8000
이상구
고려대
골프 중급
9000
이상구
고려대
개인피티
6000
박덕팔
연세대
제 2정규화 해놓은 테이블을 가져왔습니다.
제 2정규형을 만족하기 때문에 partial dependency는 없어 보이는군요.
하지만 '출신대학'이라는 컬럼에 주목해봅시다.
'프로그램'이라는 primary key와는 전혀 상관이 없고 그냥 '강사' 컬럼에만 상관이 있습니다.
('강사' 컬럼에 종속되어있다고 표현함)
이 경우 '출신대학' 컬럼을 다른 테이블로 빼면
제 3정규형을 만족하는 테이블 완성입니다.
프로그램
가격
강사
스쿼시
5000
김을용
헬스
6000
박덕팔
골프
8000
이상구
골프 중급
9000
이상구
개인피티
6000
박덕팔
강사
출신대학
김을용
서울대
박덕팔
연세대
이상구
고려대
강사정보 table을 만들어서 거기에 출신대학 컬럼을 저장했습니다.
이러면 이제 박덕팔 강사의 학벌세탁으로 인해 출신대학이 달라져도 한 곳만 수정하면 됩니다.
그래서 결국 제 3정규화까지 해놓으면 수정작업이 간편해집니다.
물론 제 3정규화까지 하게 되면 강사의 출신대학을 출력하려면 불편함이 생깁니다.
그렇지만 관계형 데이타베이스에서는 제3정규화까지는 하는 경우가 많습니다.
제3정규형 - 교과서 버전
제2정규형 테이블에서 transitive dependency를 제거하면 그게 제 3정규형
어려운 말로 이행 함수적 종속 제거

1. composite primary key 또는 primary key 역할을 하는 컬럼이 있고
2. 거기에 직접 종속된 컬럼A가 있고
3. 또 거기에 직접 종속된 하찮은 컬럼B가 있으면
컬럼B가 primary key 컬럼에 transitive dependency 가 있다고 표현합니다.
그래서 그 컬럼B를 다른 테이블로 옮기라는 소리입니다.
옮기면 제3정규형을 만족하는 테이블이 완성됩니다.
제4, 5, 6 정규형도 있는데 대부분은 3까지만 하면 대부분의 중복문제는 해결할 수 있기 때문에
심심하면 찾아보도록 합시다.
PrimaryKey , Foreign Key
정규화하려고 테이블을 쪼갤 때가 많습니다. 그 경우 주의점은
1. 테이블마다 항상 primary key 역할을 하는 컬럼을 넣어두는게 좋습니다. ex) id 컬럼럼
2. 다른 테이블에 있는 컬럼내용을 가져다쓸 때도 primary key를 사용하는게 좋습니다.

예를 들어서 아까처럼 제3정규화 하느라 이렇게 테이블을 분리해놨다고 칩시다.
이 테이블을 고쳐보면

1. 테이블마다 primary key 역할을 할 수 있는 id 컬럼같은거 하나 만들어두면 좋습니다.
Q. composite primary key가 이미 있는데요?
A. 그거써도 되는데 id 컬럼 만들어두면 나중에 SELECT로 원하는 행만 찾을 때 편리합니다.

2.다른 테이블에 있는 컬럼내용을 가져다쓸 때도 primary key를 사용하는게 좋습니다.
지금 왼쪽 테이블보면 '강사' 컬럼이 있습니다.
거기에 강사 이름이 들어가야하는데 강사 정보는 오른쪽 테이블에 들어있군요.
그럴 경우 강사 이름을 그대로 적는것 보다는 강사의 id를 적는게 좋습니다.
이러면 나중에 동명이인 강사가 생겨도 명확히 구분할 수 있으니까요.
저기서 강사id 컬럼을 전문용어로 foreign key 라고 합니다.
어려운건 아니고 다른 테이블에 있던 primary key를 다른 테이블에 사용할 때는 foreign key라고 부릅니다.
참고로 알아둡시다.
Foreign Key 등록하는 법
실제 컬럼에다가 "이 컬럼은 foreign key 역할이다"라고 등록할 수도 있습니다.
그럼 장점이 몇개 있어서 그거 하는 법을 알아봅시다.
우선 program 테이블과 teacher 테이블을 만들어 봅시다.
그리고 아래 그림처럼 데이터도 입력하세요.


1. 테이블마다 Foreign Keys 메뉴가 있습니다.
그래서 program 테이블 들어가서 "새로운 foreign key 만들기" 를 클릭합니다.

2.Reference table 메뉴에선 현재 테이블에서 어떤 다른 테이블의 primary key를 참조할건지 선택하면 됩니다.
Column 메뉴에선 foreign key 제약 달아줄 program 테이블의 컬럼 선택하면 되고
Ref Column 메뉴에선 참조당할 teacher 테이블의 컬럼을 선택하면 됩니다.
그리고 저장버튼 누르면 끝입니다.

3. program 테이블 가보면 뭔가 변해있습니다.
foreign key 컬럼에 화살표가 생기는데 눌러보면 연결된 다른 테이블과 행을 보여줍니다.
그래서 나중에 강사id가 1인 사람이 누군지 궁금하면 클릭만 해보면 되는 것임
그래서 foreign key 제약조건을 등록해두면 저런게 편리해집니다.
다른 장점도 있는데
teacher 테이블로 이동해서 강사 한명을 삭제 & 저장해봅시다.
그럼 에러가 나면서 삭제를 막아줍니다.
왜냐면 "다른 테이블에서 foreign key로 사용중인 데이터이기 때문에 함부로 삭제하지 말라"는 뜻입니다.
이런 실수를 방지할 수 있어서 foreign key로 등록해놓는 것임
하지만 삭제하나 할 때마다 귀찮아지고 나중에 테이블 구조변경도 귀찮아져서 그냥 foreign key 등록 안하는 곳들도 있습니다.
역정규화
Join이 너무 많아지는 DB 설계와 쿼리는 요청을 처리하는 시간을 증가시키는 문제가 있기 때문에 모든 주요 Entity를 분리하는 것이 좋은 것이 아니라 DB의 전반적인 성능을 향상시킬 수 있는 구조화 과정을 거치는 것이 필요하다.
역정규화는 중복을 허용하며 Entity를 다시 통합하거나 분할하여 정규화 과정을 통해 도출된 DB 구조를 재조정하는 과정이다.
✨ 실습.

쇼핑몰의 구매내역 테이블입니다.
여러분이 알아서 테이블을 나눠서 제2, 제3 정규화를 해봅시다.
- 직접 테이블 만들어봅시다
- '상품카테고리'는 항상 '상품명'에 의해 결정됩니다.
- '무료배송여부'는 항상 '상품카테고리'에 따라서 결정됩니다.
- '가격'은 상품 1개의 가격임
바로 답부터 보지말고 생각해봅시다
================================================================

Last updated