관리 메뉴

여름 언덕에서 배운 것

정규화 /정규형 (제1,2,3) 본문

가랑비에 옷 젖는 줄 모른다 💻/SQL & DB

정규화 /정규형 (제1,2,3)

잔뜩 2023. 7. 31. 15:55

https://codingapple.com/

 

코딩애플 온라인 강좌 - 개발자도 단기완성!

단연 NO1 강사님의 NO.1 강의 역시나 명강입니다. IT 업계의 대치동 NO1. 강사같은 엄청난 강의력. 코딩애플님의 강의는, 엄청나게 기초적인 것부터 가르치는 듯 보이지만, 실제로 다루는 깊이는 절

codingapple.com

https://youtu.be/Y1FbowQRcmI

 

프로젝트해보고나니 DB설계가 진짜 중요하구나를 알게 됨 !

기획,유즈케이스,DB설계 시간이 많이드는데 많이드는 이유가 있다 ㅋㅋ

이 과정을 꼼꼼하게 다져놔야 프젝 진행하다가 다시 엎고 수정하고 엎고 수정할 일이 없다.


https://dewworld27.tistory.com/entry/SQL-1%EC%B0%A8-2%EC%B0%A8-3%EC%B0%A8-%EC%A0%95%EA%B7%9C%ED%99%94-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%82%AC%EB%A1%80-%EC%A0%95%EB%A6%AC

 

[SQL] 1차 2차 3차 정규화 개념 및 사례 정리

현재 SQLD 자격증을 공부 중이다. 이론부터 시작해서 실습으로 넘어갈 생각!! 정규화 목적 1. 데이터 중복을 최소화한다. 같은 속성을 지닌 데이터가 테이블에 중복해서 나타나는 경우가 생깁니다

dewworld27.tistory.com

정규화의 목적 

1.불필요한 데이터를 제거해 중복을 최소화하기 위해서

2.insert,update,delete 할 때 이상현상 방지

3.논리적이고 직관적인 테이블 구성을 위해

 

제 1 정규화 : 모든 도메인이 원자값으로 이루어져야한다.

- 속성이 원자값을 갖도록 해야한다.(기본키 보유)

 

제 2 정규화 : 부분 함수 종속성을 없앤다

- 기본키(primary key)가 2개 이상일 때를 복합키라고하는데

복합키 전체가 아니라 복합키 일부분에만 종속된다면 이를 구분해줘야한다.

 

제 3정규화 : 이행적 함수 종속성을 없앤다

- 기본키가 아닌 일반컬럼에 의존하는게 있다면 이를 제거한다.

 

🙄 물론 어렵지만 일단 머리에 집어 넣자 , 하다보면 진짜 느낌으로라도 이해된다!

 


🍎 빡통ver

 

제 1 정규화 - 한칸엔 한개의 데이터만

 

<수강현황 테이블>

학번 이름 수강과목
20120718 이태민 양자역학의이해
20130614 문태일 금손문선생요리교실
20180802 이마크 초보힙합

 

근데 이태민이 실용음악의 이해도 듣는다면?

학번 이름 수강과목
20120718 이태민 양자역학의이해 , 실용음악의 이해
20130614 문태일 금손문선생요리교실
20180802 이마크 초보힙합

물론 이렇게 저장해도 되지만 나중에 수정,삭제 작업이 힘들어진다.

하나의 셀안에는 하나의 데이터만 보관하자 .(제 1정규화)

 

제2정규화

현재테이블의 주제와 관련없는 건 다른테이블로 옮기자.

<수강현황 테이블>

학번 이름 수강과목 등록금 납부여부
20120718 이태민 양자역학의 이해 5000 0
20130614 문태일 금손 문선생 요리교실 6000 1
20180802 이마크 초보 힙합 7000 0
20180802 이마크 금손 문선생 요리교실 6000 1

 

금손 문선생 요리교실 가격이 8000이 되었다고 해보자, 그러면 하나하나 변경해줘야함

수강생이 127명이면..? 난감

사실 등록금 테이블은 수강신청현황테이블과 주제에 맞지는 않음

수강과목 테이블을 새로 만들어서 등록금 테이블을 옮기자.

<수강과목 테이블>

수강과목 등록금
양자역학의 이해 5000
금손 문선생 요리교실 6000
초보 힙합 7000

 

이러한 작업을 제 2 정규화 라고 한다.

나중에 마크가 얼마낼지 궁금하다면JOIN하면된다.

 

심화ver

제2정규화

부분함수를 종속제거

 

 primary key란 행을 구분 할 수있는 유니크한 데이터를 담은 컬럼

근데 하나만으로 정의하기 어려울 때가 있다.

 

<수강현황 테이블>

학번 이름 수강과목 등록금 납부여부
20120718 이태민 양자역학의 이해 5000 0
20130614 문태일 금손 문선생 요리교실 6000 1
20180802 이마크 초보 힙합 7000 0
20180802 이마크 금손 문선생 요리교실 6000 1

 

학번만으로도 혹은 수강과목만으로는 primary key 가 되기 어렵다 . 둘이 합쳐야 primary key 역할이 가능한데

이를 복합키 라고 한다.

 

근데 복합키에 속하는게 아니라

복합키 중 하나에만 종속되는 컬럼을

부분함수에 종속되었다고 하는데

여기서 가격은 수강과목에 의해 결정되지, 학번이 중요한게 아님으로

부분함수에 종속되었다고 볼 수있다. 그래서 따로 빼는 거다.

 

하지만 납부여부는

학번에만 속하지도, 수강과목에만 속하지도 않는다.

하지만 학번+수강과목 에는 속함으로 다른테이블로 빼지 않아도된다.

 


 

제3정규화

 

🍎제2정규형을 만족하는 테이블에서

기본키(primary key) 또는 복합키(composite primary key) 컬럼에 종속된게 아닌

일반 컬럼에 종속된 컬럼을 다른 테이블로 빼면

그게 제3정규형 테이블입니다. 

 

<광야대 수강테이블>

수강과목 등록금 교수 출신대학
양자역학의 이해 5000 최민호 샤인대
금손 문선생 요리교실 6000 김도영 이칠대
초보 힙합 7000 황런쥔 드림대

 

제 2 정규화를 만족하는 테이블이다.

수강과목이 기본키이고

출신대학 컬럼을 봤을 때 , 교수 컬럼에 종속되는걸 볼 수있다.

<교수정보 테이블>

교수 출신대학
최민호 샤인대
김도영 이칠대
황런쥔 드림대

 

교수의 정보가 달라져도 한 곳만 수정해도 되기에 편하다. 이를 제 3 정규화라고 한다.

 

 

심화 ver

이행함수 종속을 제거한다.

x라는 기본키 컬럼에 y컬럼이 종속되어있고

z 컬럼이 y컬럼에 종속되어있을때

z가 x컬럼에 이행함수종속 되었다고 볼 수 있다.

그러면 z컬럼을 옮기는게 제3정규형이다.

 

<광야대 수강테이블>에서

교수컬럼이 수강과목 컬럼(기본키)에 종속되어있고

출신대학 컬럼이 교수 컬럼에 종속되어 있음으로

이행함수 종속적이니 출신대학 컬럼을 바꿔야 한다.

 


숙제

다음테이블 보고 제2,3 정규화 해보기

상품카테고리는 상품명에 의해 결정된다

무료배송여부는 상품카테고리에 따라서 결정된다

가격은 상품 1개의 가격이다

 

구매내역테이블

아이디 이름 상품명 카테고리 구매수량 구매날짜 가격 무료배송여
kim12  김민수 블랙니트 상의 2 1월1일 5000 N
park45 박상수 양복바지 하의 3 1월2일 6000 N
lee67 이정수 이어링 악세서리 3 1월2일 6000 Y

제2정규화

구매내역이라는 주제에 안어울리는거(카테고리가 필요없어보임)

상품명,카테고리를 따로 상품 테이블로 뺄 필요성이 보인다.

 

제 3정규화

무료배송여부가 상품카테고리에 따라 결정된다고 가정

그러면 상품명←카테고리←무료배송여부 제 3정규화 위반

테이블 분리 필요

 

내 생각.

구매내역 테이블 (아이디,이름,상품명,구매수량,구매날짜,가격)

상품테이블(상품명,카테고리,가격)

무료배송여부테이블(상품명,카테고리,무료배송여부)

 

 

정답

회원 테이블 (id,아이디,이름)

상품 테이블(id,상품명,카테고리id(외래키),가격)

상품카테고리 테이블(id,카테고리,무료배송여부)

구매내역 테이블(id,구매자id(외래키),상품id(외래키), 수량, 구매날짜)

 

구매내역 테이블에서 구매자,상품명,수량,날짜 4가지가 있어야 식별 가능함으로 복합키

그것들 중 1개에만 종속이 되는 회원이름, 상품카테고리,가격은 테이블 분리 (제2정규화)

무료배송여부는 이행함수종속으로 테이블 분리(제3정규화)

 

728x90