지난 포스터에서 이야기했던 이상과 함수 종속성에 이어 마지막으로 정규화에 대해 이야기해보려고 합니다

 

이상을 치료하는 방법인 정규화는 치료 스케일에 따라 그 규약이 더욱 빡빡해 집니다

즉 정규화 숫자가 올라갈수록 더 어렵다는 이야기가 되겠습니다.


먼저 제 1 정규화(1NF)에 대해서 이야기해봅시다

제 1 정규화는 테이블에 있는 모든 속성의 레코드 값이 원자값을 가지고 있는 형태를 말합니다.

여기서 새로운 개념이 등장하네요 바로 원자값이란 개념이죠

 

여기서 말하는 원자값이란 쉽게 설명하자면 최소한으로 쪼갤 수 있는 데이터의 한계입니다.

예를들어 주민등록번호를 생각해보면 주민등록번호를 앞자리와 뒷자리로 나누어 저장 할 수도 있는 것입니다.

 

<주민등록번호> -> <주민번호 앞자리, 주민번호 뒷자리>

 

사실 원자값은 설계자가 원자값이 있다고 판단되면 설계자 입장에서는 원자값이 있는것입니다. 약간 애매한 해석의 여지를 담고 있는것이지요

 

예제 하나 더 보고 가보도록 합시다

어떤 헬스장에서 회원정보를 아래와 같은 테이블에 넣어 보관하고 있다고 해봅시다

 

이름

거주지

전화번호

철수

부산

010-1111-xxxx

영희

서울

010-2222-xxxx

 

그런데 여기서 철수 회원이 업무 때문에 전화번호가 하나 더 생겼습니다.

그러면 아래와 같은 테이블이 됩니다.

 

이름🔑

거주지

전화번호

철수

부산

010-1111-xxxx

010-1111-yyyy

영희

서울

010-2222-xxxx

 

이렇게 되면 똑똑한 개발자는 전화번호라는 하나의 속성에 두개의 값을 지니고 있는 것은 원자값을 가지고 있지 않다는 것을 알아차리게 될 것입니다.

 

따라서 개발자는 다음과 같이 테이블을 분리했습니다.

 

이름🔑

거주지

철수

부산

영희

서울

 

이름🗝️

전화번호

철수

010-1111-xxxx

철수

010-1111-yyyy

영희

010-2222-xxxx

이렇게 반복되는 속성을 기준으로 기본키 속성과 함께 새로운 테이블을 만드는 것입니다.

(참고로 🗝️는 외래키입니다.)

 


다음은 제 2 정규화(2NF)입니다.

제 2 정규화는 제 1 정규화를 만족하면서 완전 함수 종속인 테이블이 되었을 때 제 2 정규화라고 합니다.

여기서 이전에 포스트에서 봤던 내용인 완전 함수 종속이 나오네요

잘 상기하면서 예제를 보도록 합시다.

 

주민번호 앞자리🔑

주민번호 뒷자리🔑

이름

생년월일

거주지

890903

1111111

철수

1989-09-03

부산

950406

2222222

영희

1995-04-06

서울

여기서 잘보면

 

생년월일은 굳이 앞자리 뒷자리 둘다 쓸 필요 없이 앞자리만으로 정보를 알아낼 수 있죠

이를 표현하면 다음과 같이 됩니다.

 

주민번호 앞자리*주민번호 뒷자리 -> 생년월일     ---------   완전함수종속 위반

 

주민번호 앞자리 -> 생년월일    

 

즉 주민번호 앞자리 말고 생년월일 정보를 알아낼 수 있는 다른 최소 속성 조합은 존재하지 않기 때문에 주민번호 앞자리 -> 생년월일 이라는 정보를 바탕으로 다음과 같이 테이블을 분리합니다.

 

 

 

주민번호 앞자리🔑

주민번호 뒷자리🔑

이름

거주지

890903

1111111

철수

부산

950406

2222222

영희

서울

 

 

주민번호 앞자리🗝️

생년월일

890903

1989-09-03

950406

1995-04-06


 

제 3 정규화(3NF)는 제 2정규화를 만족하고 후보키가 아닌 속성들에서 이행 종속이 없는 테이블을 말합니다.

이번에도 이전에 포스트에서 봤던 내용인 이행 종속이 나오네요

잘 상기하면서 예제를 보도록 합시다.

 

 

학번🔑

이름

학과

학과건물

201149856

철수

컴퓨터공학

105

201549856

민희

기계공학

107

 

여기서 학과 건물은 학과와 연관이 있습니다 그리고 학과는 학번과 연결되어 있죠

 

학번-> 학과

 

학과-> 학과건물

 

이러한 이행종속은 다음과 같이 풀어줍니다.

 

 

학번🔑

이름

학과

201149856

철수

컴퓨터공학

201549856

민희

기계공학

 

 

학과🗝️

학과건물

컴퓨터공학

105

기계공학

107


 

마지막 BCNF는 제3정규화를 만족하고 모든 결정자는 후보키여야 합니다.

 

여기서 결정자란 테이블의 나머지 속성을 모두 결정할 수 있는 속성을 말합니다.

 

예를들어 학번을 알고 있으면 이름과 주소 성별을 알 수 있겠네요 그러면 학번이 결정자가 됩니다.

 

학번 -> (이름, 주소, 학년, 성별)

 

예를 들어보죠

 

학번🔑

과목🔑

교수

201149856

운영체제

오박사

201549856

신뢰성공학

브라운박사

 

위 테이블을 분석해보면 학번과 과목으로 교수를 결정할 수 있습니다. 그러나 교수가 한학기당 한 과목을 맡게되면 교수라는 속성으로 다시 과목을 결정할 수 있게 됩니다.

함수 종속 표현으로 표현하면 다음과 같이 되는거죠

 

학번,과목-> 교수

교수-> 과목

 

이렇게 되면 교수라는 속성은 현재 후보키가 아니기 때문에 BCNF를 만족하지 않게 되는군요

 

따라서 교수를 후보키로 하는 새로운 테이블을 만들어 줘야합니다.

 

 

학번🔑

교수

201149856

오박사

201549856

브라운박사

 

과목

교수🗝️

운영체제

오박사

신뢰성공학

브라운박사

이렇듯 정규화까지 알아봤습니다. 이러한 정규화는 데이터의 중복을 낮춰주지만 반대로 조인 연산 비용이 증가하여 지나친 정규화는 시스템에 큰 부담이 됩니다. 따라서 정규화를 사용할려면 데이터 안정성과 시스템 부하에 적절한 트레이드 오프를 잘 정해야합니다.


WRITTEN BY
&#48;

,

관계형 데이터베이스를 공부하는데 맞이하는 가장 첫번째 난벽은 개인적으로 정규화라고 생각합니다

보통 정규화에 앞서 배울 내용들 즉 릴레이션이나 스키마 구조, DBMS의 역활같은 거는 그냥 외우면 되는거니까요

그런데 이 정규화라는 녀석은 성격이 약간 다릅니다. 정규화는 철저한 논리식에 기반을 두고 있기 때문에 암기보다는 이해가 중요합니다. 이러한 이해를 바탕으로 여러가지 규칙을 칼같이 지키며 릴레이션을 정규화할 수 있습니다. 

사실 정규화가 어려운 이유는 위의 것들 도 있겠지만 가장 큰 문제는 문제점이 뭔지를 찾는게 더욱 문제가 되겠네요

이건 뭐라 설명할 수 없고 그저 열심히 여러 문제나 모델링을 하면서 문제점을 보는 눈을 기르는 수밖에 없습니다.

 

먼저 배울건 데이터베이스를 막 설계하면 생기는 문제점과 그 문제점을 측정할 수 있는 도구를 알아봅니다

그리고 이 데이터 베이스의 수리 방법을 정규화라고 하는데 여기서는 보통 데이터베이스 정규화하면 배우는 1~3 정규화와 BCNF의 이해에 주력합니다 더욱 공부하고 싶으신 분들은 4~6정규화까지 찾아서 공부해보시면 좋을것같습니다.

 

위 마인드맵은 이야기의 진행의 큰 흐름입니다.

 

 

먼저 정규화의 정의를 봅시다

정규화의 정의 : 관계형 데이터베이스의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스

(위키백과 참조)

 

위 정의는 한눈에 봐서 이해하기에는 무리가 있군요

문장을 분해해봅시다

 

관계형 데이터베이스의 설계에서 중복을 최소화하게 -> 그러면 RDB에서 중복이 무엇인가라는 개념이 필요하겠죠?

데이터를 구조화하는 프로세스 -> 구조화가 무엇일까요?

 

저 문장을 분해해서 해석했더니 두 가지 의문이 나왔네요

"중복"의 개념과 "구조화"가 무엇인지에 대한 의문이죠

 

먼저 구조화를 설명하자면 여러 데이터가 모여서 테이블을 형성하고 그 테이블 들이 모여서 하나의 스키마를 구성하는게 관계형 데이터베이스에서 말하는 구조화 입니다. 

 

데이터 중복이 데이터베이스 설계를 막장으로 하면 생기는 문제점인데 약간 복잡하니 예를 들어보죠 

어떤 영화관에서 예약 고객을 받기 위해 데이터베이스 테이블을 아래와 같이 운영하고 있다고 합니다 

 

고객번호🔑

영화이름🔑

티켓수

상영관

001

포레스트 검프

3

3

004

쉰들러 리스트

2

2

002

타이타닉

5

3

006

트루먼 쇼

1

1

001

쇼생크탈출

2

4

004

반지의 제왕

1

2

007

트루먼 쇼

4

4

이 테이블은 SELECT 쿼리를 사용할 때는 문제가 없지만 이 테이블에 들어있는 속성이나 데이터 때문에 3가지 문제가 발생합니다 문제라기 보다는....이 문제는 마치 영어의 불규칙동사를 외우는 것과 같습니다! 쓸려면 예외를 외워야하고 실수가 빈번하게 일어나죠

 

먼저 3가지 이상에 대해 알아봅시다

 

삽입 이상- 새로운 영화 "기생충"이 4관에 상영 예약 데이터를 테이블에 추가해본다고 생각해봅시다

그러면 <NULL, 기생충, NULL, '4관'> 을 삽입해야하는데 고객번호가 기본키이기 때문에 데이터가 넣어지지 않습니다

신규 영화이름을 넣기 위해선 몰래 고객 아무나 한명을 예약에 넣어야되죠 이것을 삽입 이상이라고 합니다

 

갱신 이상 -  "트루먼 쇼" 상영관을  1관에서 3관으로 변경하는 경우를 생각해봅시다

영화 위에는 튜플 2개만 변경하면서 오류가 발생했습니다 007 고객이 예약한 자료는 갱신이 안되버렸습니다

나중에 007 고객이 영화관에 와서 4번 상영관으로 가면 매우 뻘쭘해지겠군요 

 

삭제 이상 - 고객번호가 001인 고객이 "포레스트 검프" 예약을 취소하였습니다 그런데 이를 어쩌죠 001 고객이 예약한 정보가 테이블 내에 "포레스트 검프" 정보를 가지고 있는 유일한 튜플이네요 그러면 저 튜플을 삭제하는 순간 테이블 내에선 다시 입력하기 전까지 "포레스트 검프"가 있는지도 모르겠군요

 

이러한 이상이 생기는 주원인은 데이터 중복 때문인데 데이터 중복을 낮추는 방법이 바로 정규화입니다

정규화에선 중복을 최소화하게 데이터를 구조화 한다고 하였습니다. 이를 위해서 테이블의 갯수나 테이블의 속성을 재설계하는 것이죠. 즉, 데이터의 중복을 낮추기 위해 테이블을 쪼개고 고치고 다시 만드는것 <구조화> 하는거죠

 

이제 1~3 정규화와 BCNF에 대해 본격적으로 들어가기 전에  한가지 중요한 개념이 있습니다. <함수 종속성> 이라는 개념인데 이 개념은 테이블이 주어졌을 때 어디가 이상한지 그 이상한 점을 찾는 논리적 도구입니다.

마치 의사가 내장 어떤 부분이 아픈지 판단하는 청진기로 봐도 무방합니다.

 

먼저 이 새로운 도구의 정의를 봅시다

 

 함수 종속성 : 같은 테이블 안의 속성 간에 특정 속성 값이 함수적으로 다른 속성 값을 결정하는 종속관계

 

이번에도 상당히 복잡한 개념입니다 한번에 이해가 잘 안되는게 당연한 현상이죠

이거는 저 말뜻을 이해하는 것보다는 예를 통해 한번 보는게 훨씬 쉽습니다

 

회사의 사원들의 정보를 관리하는 테이블을 다음과 같이 만들었습니다.

 

사원번호🔑

주민등록번호🔑

이름

거주지

001

111111-111111

김길동

서울

002

111111-111112

마이클

서울

003

111111-111113

도우너

깐따삐야

 

여기서 사원번호가 주어지면 주민등록번호를 알 수 있겠죠?

그러면 함수 종속성으로 이렇게 쓸 수 있습니다.

 

사원번호 ->주민등록번호

 

이렇게도 쓰는게 가능합니다

 

사원번호*거주지 ->주민등록번호*거주지

 

그런데 주민등록번호로 이름을 알 수 있네요 물론 사원번호로도 알 수 있죠 이것을 이렇게 적는게 가능합니다

주민등록번호->이름

사원번호->이름

 

이렇게 특정 속성 값으로부터 다른 속성값을 결정 하는 관계를 함수 종속성이라 합니다

 

논리적으로 생각해서 이 속성은 이 속성을 결정할 수 있다!!!라고 생각하면 그렇게 해석해도 됩니다. 단 자기만 옳다고 생각 되는게 아니라 사회 전반적으로 생각이 인정받아야겠지만요... 이러한 특성 때문에 함수 종속성은 여러 표현이 나올 수 있습니다. 그 표현들을 알아보죠

 

1. x->y and x->z then x->yz

ex) 사원번호->이름 and 사원번호->거주지 then 사원번호 -> 이름*거주지

 

2. x->yz then x->y and x->z

ex) 사원번호 -> 이름* 거주지 then 사원번호->이름 and 사원번호->거주지 

 

3. x->y and wy->z then wx->z

ex) 여기서는 조금 다른 속성을 끌어쓰겠습니다

출생일->주민번호앞자리 and 주민번호앞자리*주민번호뒷자리->이름 then 출생일*주민번호뒷자리->이름

 

4. x->y and z->w then xz->yw

ex) 사원번호->이름 and 주민등록번호->거주지 then 사원번호*주민등록번호->이름*거주지

 

여기서 완전 함수 종속성과 부분 함수 종속이라는 개념이 나오는데 각각의 개념은 다음과 같습니다.

 

완전함수종속

: 테이블에서 속성 x가 다른 단일 혹은 복합 속성 y에 함수적 종속이면서 다른 어떤 속성과도 함수적 종속이 아닌 것

예를 들어 x1*x2*x3.... -> y을 보면 쉽게 알 수 있습니다.

위에서 예를 들면 다음과 같은 스키마가 있다고 합시다

 

수강 스키마

<학번, 과목번호, 학점, 성별, 강의교수>

 

이때 학점은 과목번호만으로 정해지지 않고 학번만으로 정해지지 않습니다.

오직 학번과 과목번호의 속성의 조합으로만 알 수 있습니다.

 

학번*과목번호->학점

 

부분함수종속 

위쪽 테이블을 다시 가져와보죠

사원번호🔑

주민등록번호🔑

이름

거주지

001

111111-111111

김길동

서울

002

111111-111112

마이클

서울

003

111111-111113

도우너

깐따삐야

 

여기서 거주지는 주민등록번호로도 알 수 있는 속성입니다.

이때 사원번호와 거주지의 관계를 부분함수종속이라고 합니다.

 

이행 함수 종속

이행함수종속이란 x->y이고 y->z이면 x->z인 속성을 말합니다.

 

예를 들어 다음과 같이 학생 스키마가 있다고 합니다.

 

학생

<학번, 이름, 학과, 학과건물>

 

이때 좀 억지긴 하지만 학번으로는 학과건물을 알아낼 수 없다고 합시다!!

학과건물은 오직 학과에 의해서만 알아낼 수 있는거죠

 

그러면 학번-> 학과 이고 학과->학과건물 이면 학번->학과건물 이라는 논리를 이끌어 낼 수 있습니다.

이것을 이행종속이라고 합니다.

 

이렇듯 함수적 종속을 통해 현재 테이블의 속성관계를 표현할 수 있게 되었습니다.

지금까지 그냥 데이터베이스를 막 설계하면 생기는 문제점과 그 문제점을 측정할 수 있는 도구를 얻었습니다.

그러면 마지막으로 수술 방법은 알아야하는데 문서가 너무 길어져서 정규화에 대한 이야기는 다음으로 미루도록 하겠습니다. 

 

앞서 이야기한 이상과 함수 종속성 정리입니다

 

 

 

 

 

 

 


WRITTEN BY
&#48;

,