DataBase

[DB] DataBase 정규화

Y0un9Ki 2024. 4. 15. 15:48
728x90
반응형

오늘은 DB의 기본인 정규화에 대해서 알아보겠다.

 

이것은 유튜브 코딩애플님의 데이터 정규화가 뭔지 설명해 보세요 라는 영상을 기반으로 만들었다. 또한 몇몇 블로그도 참고 하였으며 밑에 출처를 써놓을 것이다.

 

정규화(Normalization)


정규화란 가장 기본적으로 테이블 간의 중복된 데이터를 허용하지 않는 것이다. 중복된 데이터를 허용하지 않음으로써 무결성을 유지 할 수 있고, 데이터베이스의 저장 용량을 줄 일 수있다. 특히 관계형 데이터베이스에서 많이 이용한다.

오늘 블로그에서 작성할 것은 제 1정규화, 제 2정규화, 제 3정규화이다. 순서대로 차례차례 알아보자.

 

1.  제 1정규화

제 1정규화란 테이블의 컬럼값이 하나의 원자를 가지도록 테이블을 분해하는 것이다.

 

예를 한번 보자.

회원번호 회원이름 프로그램
101 강호동 스쿼시초급
102 손흥민 헬스
103 김민수 헬스, 골프초급

 

위에 테이블 같이 회원번호 103인 김민수라는 회원은 헬스와 골프초급이라는 프로그램을 수강을 했다. 

그런데 여기서 우리가 골프초급을 수강신청한 사람을 찾아야 하거나 프로그램명이 바뀌어서 수정을 해야할 때 프로그램이라는 컬럼에 여러가지 원자가 들어가 있다면 우리는 굉장히 어려워지고 귀찮은 작업을 해야한다.

where문을 써서 하나만 찾아야 되는 것을 %LIKE%라는 연산자로 찾아야 된다거나 프로그램명 수정은 생각도 나지 않는다. 그렇기에 우리는 제 1정규화를 통해서 아래와 같이 테이블을 나누어 준다.

회원번호 회원이름 프로그램
101 강호동 스쿼시초급
102 손흥민 헬스
103 김민수 헬스
103 김민수 골프초급

 

즉 한칸에 하나의 데이터만 들어간다 라는 것이 제 1정규화 이며 이를 만족하는 테이블은 제 1정규형을 만족시키는 식 이라고 불린다.

 

2. 제 2정규화

제 2정규화란 제 1정규화를 진행한 테이블에 대해 완전 함수 종속을 만족하도록 테이블을 분해하는 것이다. 여기서 완전 함수 종속이라는 것은 기본키(복합키, Composite Primary Key)의 부분집합이 결정자가 되어선 안된다는 것을 의미한다.

또한 Composite Primary Key partial dependency를 완전히 제거한 테이블을 제 2정규형을 만족하는 식이라고 한다.

 

이 것은 참고한 블로그에 예시를 한번보자.

학생번호 강좌이름 강의실 성적
501 데이터베이스 공학관 110 3.5
401 데이터베이스 공학관 110 4.0
402 스포츠경영학 체육관 103 3.5
502 자료구조 공학관 111 4.0
501 자료구조 공학관 111 3.5

 

(제 2정규화를 진행)

⬇️

학생번호 강좌이름 성적
501 데이터베이스 3.5
401 데이터베이스 4.0
402 스포츠경영학 3.5
502 자료구조 4.0
501 자료구조 3.5
강좌이름 강의실
데이터베이스 공학관 110
스포츠경영학 체육관 103
자료구조 공학관 111

 

이 테이블에서는 기본키는 (학생번호와 강좌이름)으로 복합키를 갖는다. 그리고 (학생번호와 강좌이름)인 기본키는 성적을 결정한다.

그런데 강의실이라는 컬럼은 기본키의 부분집합인 강좌이름에 의해 결정될 수 있다.

즉, 기본키(학생번호, 강좌이름)의 부분키인 강좌이름에 따라 강의실이 결정되기 때문에 이것을 따로 빼서 관리를 할 수 있는데 이것이 제 2정규화이다.

 

여기서 Composite Primary Key(복합키)는 학생번호와 강좌이름이 되고 partial dependency를 제거한다는 것은 복합키의 부분집합인 강좌이름에 따라 결정되는 강의실이라는 컬럼을 따로 빼줌으로서 partial dependency를 제거하고 복합키에 따라 결정되는 성적만을 남겨줌으로써 테이블을 재구성하는 것이 제 2정규화를 만족하는 식이 되는 것이다.

 

3. 제 3정규화

제 3정규화란 제 2 정규화를 진행한 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것이다.

쉽게 말하면 일반컬럼에만 종속된 컬럼은 다른 테이블로 빼주는 것이 제 3정규화 인것이다.

 

예시를 보자.

프로그램 가격 강사 출신대학
스쿼시 5000 김을용 서울대
헬스 6000 박덕팔 연세대
골프 8000 이상구 고려대
골프중급 9000 이상구 고려대
개인피티 6000 박덕팔 연세대

 

(제 3정규화를 진행)

⬇️

프로그램 가격 강사
스쿼시 5000 김을용
헬스 6000 박덕팔
골프 8000 이상구
골프중금 9000 이상구
개인피티 6000 박덕팔
강사 출신대학
김을용 서울대
박덕팔 연세대
이상구 고려대

 

위와 같은 테이블이 있을 때 Composite primary key는 존재하지 않고 프로그램이라는 Primary key만 존재하게 된다.

하지만 여기서 출신대학이라는 컬럼강사라는 일반 컬럼에 의해서만 결정이 된다.

그렇기에 출신대학이라는 컬럼을 따로 빼주는 것이 제 3정규화를 진행하는 것이다.

 

4. BCNF 정규화

BCNF정규화는 블로그를 검색하다가 알게 된 정규화이다. 그렇기에 이것또한 정리를 해놔야겠다.

BCNF정규화란 제 3정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것이다.

 

이것은 참고한 블로그에 예시를 한번 살펴보자.

 

특강수강

학생번호 특강이름 교수
501 소셜네트워크 김교수
401 소셜네트워크 김교수
402 인간과 동물 승교수
502 창업전략 박교수
501 창업전략 홍교수

 

특강수강 테이블에서 기본키는 (학생번호, 특강이름)이다. 즉 복합키를 갖는다. 그리고 기본키는 교수를 결정하고 있다. 하지만 여기서 교수는 특강이름을 결정하고 있다. 창업전략이라는 같은 이름에 특강이 있지만 교수는 다르기에 교수가 특강이름을 결정하는 역할을 한다.

여기서 문제는 교수가 특강이름을 결정하는 결정자이지만, 후보키가 아니라는 것이다. 그렇기에 BCNF정규화를 만족시키기 위해서는 위의 테이블을 분해해서 정규화를 진행해주어야 한다.

 

BCNF정규화를 진행해보자!!

⬇️

특강신청

학생번호 특강교수
501 김교수
401 김교수
402 승교수
502 박교수
501 홍교수

 

특강교수

특강교수 특강이름
김교수 소셜네트워크
승교수 인간과 동물
박교수 창업전략
홍교수 창업전략

 

 


참고한 블로그

https://mangkyu.tistory.com/110

 

[Database] 정규화(Normalization) 쉽게 이해하기

지난 포스팅에서 데이터베이스 정규화와 관련된 내용을 정리했었다. 하지만 해당 내용이 쉽게 이해되지 않는 것 같아서 정규화 관련 글을 풀어서 다시 한번 정리해보고자 한다. 1. 정규화(Normaliz

mangkyu.tistory.com

참고한 유튜브

https://www.youtube.com/watch?v=Y1FbowQRcmI&t=67s

 

 

@@++@@++

728x90
반응형