프로그래밍/DBMS

데이터베이스 모델링 / 정규화(정규형)

Heidong 2021. 9. 2. 22:58
반응형

모델링이란 단순하게 말하자면 데이터베이스에 들어갈 내용들을 시각적으로 즉 눈으로 보기 편하게 하기 위해서 하는 것

모델링을 통해 복잡한 데이터들을

추상화 - 현실세계를 일정한 형식에 맞춰 표현

단순화 - 현실세계를 약속된 규약에 의한 표기법이나 언어로 표현해서 좀 더 이해하기 쉽게

명확화 - 누구나 이해하기 쉽게 애매모호한 것들을 제거

를 해야한다.

 

쉽게 말하자면 일반인한테도 이러이러해서~ 뭘 할거에요~ 설명했을때 이해 할 수 있도록 

DB를 풀어서 표현하는거라 보면 된다.

 

모델링의 3가지 종류 !

개념적 모델링

쉽게 말하자면 ER 다이어그램을 그려서 눈으로 보기 편하게 한다는것

예를 들면

이런식으로 다이어그램으로 표시하면 한눈에 뭘 하고자 하는지 알 수 있다.

 

 

 

 

논리적 모델링

ER다이어그램을 사용해서 관계 스키마 모델을 만드는 과정임

여기서 스키마란 => 데이터베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다.

먼저 윗단계 개념 모델링 단계에서 대강 엔티티(=테이블) 구조를 그렸다면

여기서는 더 상세하게 작성하는거라고 보면 된다.

여기저기 가지치기를 시작한다는 느낌

ER다이어그램을 구체적으로 자세하게 작성하는 단계임

IE 까마귀발 표기법을 자주 쓴다.

이런식으로 다이어그램을 세분화 해나가는 과정이 논리적 모델링 입니다.

 

 

물리적 모델링

위에서 작성한 논리 모델을 각 DBMS(오라클,MYSQL,마리아디비 등등)의 특성에 맞게 데이터 베이스 저장 구조(물리 데이터 모델)로 변환하는 것

한마디로 진짜 코딩에 들어가기 위해 나는 오라클을 쓰니까 오라클DB 특성에 맞게 정리한다는 뜻

 

 

데이터베이스 정규화

위의 모델링이 끝나면 정규화 라는 것을 해야하는데

이걸 왜 하냐?

 

1. 불필요한 데이터 정리하기 위해서

2. 데이터 저장을 논리적으로 하기 위해서

 

쉽게 말해서 정규화를 안하면 DB에 데이터를 넣고, 수정하고, 삭제하고 할때 문제가 생길 확률이 매우 높다는 것.

그냥 무조건 해야 한다.

이상 현상이 생기지 않도록 정규화를 하자

정규화

 

 

보통 5까지는 안가고 BCNF나 4단계에서 끝난다.

 

1차 정규화

수강과목 컬럼에 여러개 데이터가 들어가 있는데 이건 한번에 넣는게 아니라

컬럼의 값이 1개씩만 있어야 한다 !

데이터는 늘었으나 전보단 논리적으로 바뀌었다

 

2차 정규화

2차 정규화 부터가 본격적으로 정규화를 시작하는 단계가 된다.

 

2차 정규화는 테이블의 모든 컬럼이 완전 함수적 종속을 만족 해야 한다.

 

기본키 중에서 특정 컬럼에만 종속된 컬럼이 없어야 한다.(부분적 종속이 없어야 한다.)

 

종속을 이해하기 위해서 먼저

 

 

여기서 기본키가 학번과 과목번호 인데

학년은 학번에 종속 되어있고

성적은 학번과 과목번호 둘다에 종속 되어 있다.

 

그러니까 학년은 학번에 완전 종속이라 => 학번을 알면 학년을 알 수 있다.

마찬가지로 성적은 (학번, 과목번호 둘 다 기본키)에 종속이다 => 학번, 과목번호를 알아야 성적을 알 수 있다.

그런데? 아까 학년은 학번에 완전 종속이였는데 

여기에 (학번, 과목번호)에 종속이라고 한다면? 이미 학번만 있어도 완전 종속인데 굳이 추가를?

이런게 부분 종속이다.

 

즉 필요가 없다는거다.

 

이를 해결하기 위해서 2차 정규화가 필요함

즉 => 테이블을 쪼갠다(나눈다)

 

아까의 그림을 다시 보자.

아까 위에 올렸던 그림이다.

이거 원래는 

학번 과목번호 성적 지도교수 학과

이렇게 한 테이블에 있던건데

 

2차 정규화를 통해서 저렇게 2개의 테이블로 나뉜것이다.

학번하고 과목번호만 있어도 성적을 알 수 있는데 굳이 지도교수랑 학과가 필요할까?

학번만 알아도 지도교수랑 학과가 뭔지 알 수 있는데 굳이 성적 컬럼이 필요할까?

 

그래서 나눈것이다.

 

이게 바로 2차 정규화

 

 

3차 정규화

3차 정규화는 이행적 함수 종속이 없어야 하는 것.

 

이행적 함수 종속이란?

대충 말하면 중복이 기본키 말고는 있으면 안된다는 것.

즉, 기본키 이외의 다른 컬럼이 그 외 다른 컬럼을 결정 할 수 없는 것

기본키만 다른 컬럼을 결정 할 수 있단 말임.

 

아까 2차 정규화가 끝났을때의 테이블을 보면 

기본키는 분명 학번 한개인데 <<

학번이 지도교수를 결정 할 수있음 << 이건 괜찮음

근데? 지도교수가 학과를 결정 할 수 있어버리네? << 이러면 안된다.

결정은 기본키인 학번만 할 수 있어야하는데

기본키가 아닌 지도교수가 다른 컬럼을 간섭 해버리는면 안되는 거다.

 

그래서 3차 정규화를 통해서 다시 또 테이블을! 나눠야 쪼개야 한다.

 

위 그림과 같이 쪼개버리면

학번(기본키)는 지도 교수 결정 할 수 있고

지도교수(기본키) 학과를 결정 할 수 있다.

 

BCNF 정규화

(Boyce and Codd Normal Form) 의 줄임말.

쉽게 말하면 3차 정규형을 조금 더 강화한 것!

그니까 3차 정규화까지 했는데도 해결 안되는 이상 현상을 해결하기 위함.

(그러니까 이걸 하려면 먼저 3차 정규화를 만족 해야함)

다른 예를 들어보면 교수 P1은 프로그래밍 과목을 담당하고 있는데 

갑자기 ?

과목 명을 자기 맘대로 다른걸로 바꿔 버리면???

무려 3개의 컬럼을 바꿔야 한다 ㅋㅋ

일반 컬럼(교수)이 후보키를 결정 해버리는 문제 !!

 

이걸 해결하기 위해서 한번더 테이블을 쪼개야 한다 

이렇게 한번 더 테이블을 쪼개 버리면 더 이상의 간섭은 발생하지 않는다.

 

제4 정규형

다치 종속은 1:다(多)의 관계

 

이 관계라는게 3가지 종류가 있는데

 

쉽게 말하면

 

1:1 (1대1)의 관계 =

남자나 여자는 결혼을 한번 밖에 못하니까 이게 1대1의 관계

 

 

1:다(1:N)의 관계 =

일단 부모는 자식을 자기가 원하는 대로 가질 수 있음

1명이 될수도 2명이 될수도 2130명이 될수도

그러나 자식은 무조건 하나의 부모 밖에 못가짐

이게 1대다의 관계

 

 

 

 

다:다 (N:N)의 관계 =

 

학원은 학생을 얼마든지 가질 수 있고

마찬가지로 학생은 학원을 얼마든지 몇개나 다닐 수 있음

이게 다:다 의 관계

 

 

여기서 보면 불필요하게 중복이 되는 값들이 있다.

과목은 여러 명의 교수를 가질 수 있는 다치 관계임(xx란 과목을 가르칠 수 있는 사람은 많으니까)

마찬가지로 과목은 여러개의 교재를 가질 수 있는 다치 관계임(xx과목에 대한 교재는 엄청 많다)

그러다 보니까 교수와 교재는 아무런 관련이 없는데 과목 하나 때문에 자꾸 겹치는 것

이걸 해결하기 위해서 4차 정규화를 해야한다.

 

이렇게 또 테이블을 쪼개 버리면 해결 된다.

 

 

이런 정규화를 위해 다이어그램을 그릴때 도움 되는 사이트가

ERD클라우드 << 이다.

https://www.erdcloud.com/

 

ERDCloud

Draw ERD with your team members. All states are shared in real time. And it's FREE. Database modeling tool.

www.erdcloud.com

이건 ERD클라우드로 그린건 아니지만 이런식으로 그릴 수 있게 해준다.

반응형