본문 바로가기
NSLog(@"%@", dailyLog)

데이터 베이스 정규화 1NF, 2NF, 3NF

by 틴디 2020. 12. 29.
728x90
반응형

관계형 데이터베이스 설계시 데이터의 중복이 발생하면 이상 현상(삽입 이상, 삭제 이상, 갱신 이상)이 발생하게 됩니다. 따라서 이 데이터 중복을 최소한으로 줄여 이상 현상 발생을 줄이게 되는데 이때 수행하는 것이 정규화(Normalization)라고 합니다.

 

정처기 공부시 기본 cs나 데이터베이스 경험이 없다면 한번쯤 발목 잡힐 부분이라 이 기회에 쉽게 정리해보기로!

따라서 정처기 외에  CS를 공부하시는 분이라면 뒤로가기 버튼을 눌러주세요~

 

1NF (1정규형)

1 정규형은 원자값으로 구성 되어야 합니다.

여기서 말하는 원자는 고등학교 화학에서 한 번쯤 들어봤을 만한 화학적 성질에서 이야기하는 원자를 생각하면 쉬워요

 더 이상 분해될 수 없고 쪼갤 수 없는 값을 말합니다.

즉 테이블에서 행과 열 중 열의 값을 고유 원자값으로 표현해 주면 됩니다.

쉽게 말해서 셀(테이블에서 하나의 네모 박스)에 단 한개의 값만 들어 있으면 되는 거죠!

이름 과목
김고양 데이터베이스, 운영체제
김멍멍 운영체제, 자료구조

위 테이블에서 과목'열'을 보면 각각의 셀이 

-> 데이터베이스, 운영체제

-> 운영체제, 자료구조

이렇게 여러개의 값이 들어 있는 것을 알 수 있어요

이 값들은 쪼갤 수 있는 즉 원자값이 아니므로 아래와 같이 원자값으로 표현해 주면 1정규형을 만족하게 됩니다.

이름 과목
김고양 데이터베이스
김고양 운영체제
김멍멍 운영체제
김멍멍 자료구조

그렇다면 왜 이렇게 쪼개 주는 걸까요?

데이터베이스 관점이 아닌 사람의 눈높이에서 보면 1정규형을 해주지 않아도 나름 괜찮아 보일 수도 있어요

이름으로 바로 그 학생이 듣는 모든 과목을 조회할 수 있으니까.

하지만 이를 관계형 데이터베이스화 할때는 이야기가 달라집니다.

데이터베이스라는 과목에도 수강료, 강사 등 수 많은 속성들이 존재 할 수 있고

이 속성들을 조회하려면 한 셀에 '데이터베이스, 운영체제' 이렇게 들어 있어서는 조회가 불가능합니다

(운영체제에 관련 없는 데이터베이스 과목 속성들을 이어주면 이상 현상 보다 더 심각한 문제가 생길 수 있다)

정리 : 1정규형은 한 셀에 하나의 값만 넣어주겠다!

 

2NF (2정규형)

2정규형은 부분함수 종속을 제거하여 중복을 줄여주는 정규화를 의미합니다.

말이 어렵지만 여기서 부분함수에 종속되지 않게 만들겠다! 이렇게만 이해해 두고 더 공부해봅시다

 

다른 행과 행을 구분해 주는 기본키

하나 혹은 그 이상으로 구성됩니다

문제에서는 주로 첫 번째 행에서 밑줄로 그어진 것이 기본키입니다

아래 테이블을 보면 

사용자id 코스명 수강료
1 십자수 100000
1 골프 400000
2 십자수 100000
3 축구 200000

사용자 id 와 코스명이 복합으로 기본키로 사용되고 있습니다

사용자 id + 코스명이

다른 행과 행의 차이를 구분해 주기 때문입니다

그런데 여기서 잘 보면 수강료는 사용자 id와 관계 없이 코스명만 따르고 있는 것을 볼 수 있습니다. 

그렇기 때문에 아래와 같이

사용자 id 코스명
1 십자수
1 골프
2 십자수
3 축구

 

코스명 수강료
십자수 100000
골프 400000
축구 200000

두 개의 테이블로 나누어 주어도 데이터를 조회하는데 문제가 생기지 않아요

사용자 아이디로 코스명을 찾고 그 코스명으로 수강료를 조회할 수 있습니다

그렇기 때문에 기본키가 여러 속성으로 구성되어 있고 

그 기본키 외의 속성이 그 기본키의 일부에만 관련이 있다면

이렇게 테이블을 나누어 줄 수 있고 

이 경우를 부분 함수 종속 제거 혹은 완전함수 종속 관계라고 합니다

따라서 부분 함수! 라고 한다면 기본 키 중 일부분에 속하고 있는 경우

완전 함수라고 한다면 기본키 외의 속성이 기본키 일부분이 아닌 완전히 관련있는 경우

이렇게 생각하시면 쉬워요

정리하자면

밑줄 그어진 여러 속성으로 이루어진 기본키 중 

기본키가 아닌 다른 속성이 기본키의 일부하고만 관련(종속)있다면 이를 분리한다!

 

3NF (3정규형)

3정규형은 이행함수 종속을 제거해야 합니다

여기 세개의 속성이 있다고 합시다

A, B, C

이때 A -> B, B -> C 일때 이행 함수 종속이라고 합니다

쉽게 말해서 A 속성이 B와 관련되어 있고 B 속성이 C와 관련 있을 때를 말합니다

 

id 모델명 회사명 연락처
1 APhone 감자 02)0000-0000
2 GoodPhone 감자 02)0000-0000
3 cellPhone 참치 02)1111-1111
4 WowPhone 고구마 02)1234-1234

이 테이블을 보면 id로 회사명을 조회할 수 있고 회사명으로 연락처를 조회할 수 있습니다

여기서 만약 3차 정규화를 하지 않으면 어떻게 될까로 접근해 봅시다

 id -> 회사명 -> 연락처 로 이행 함수 종속 되어 있고

이때 새로운 행을 추가해 id 는 5 모델명은 APhone, 회사명은 감자라고 할때

사용자가 감자 회사의 연락처를 같이 입력해 줘야 합니다

만약 입력해 주지 않으면 위 테이블은 삽입 이상이 일어납니다.

 

따라서 위 테이블을 아래와 같이 분리해 보면

 

id 모델명 회사명
1 APhone 감자
2 GoodPhone 감자
3 cellPhone 참치
4 WowPhone 고구마

 

회사명 연락처
감자 02)0000-0000
참치 02)1111-1111
고구마 02)1234-1234

이렇게 되기 때문에 앞에 테이블에서 새로운 모델과 회사를 입력하더라도 연착처를 다시 입력하지 않아도 됩니다

그렇기 때문에 A -> B -> C 처럼 관계 가 있는 이행 함수를 

A -> B , B -> C 로 해서 이행 함수 종속을 제거할 수 있어요


 

참고 사이트 : 

jerryjerryjerry.tistory.com/49

www.youtube.com/watch?v=J-drts33N8g

dodo000.tistory.com/20

 


혹시 틀리거나 이상한 점이 있다면 댓글로 알려주세요 🙏

728x90
반응형

댓글