_대문 | 방명록 | 최근글 | 홈피소개 | 주인놈 |
FrontPage › 정규화의이해
|
|
[edit]
1 정규화의 의미 #우리는 이제까지 데이터베이스의 설계를 위한 여러 가지를 살펴보았다. 위에서 다룬 것은 현실을 어떻게 하면 가장 근접하게 표현하는가에 대한 고려사항들이다. 이것들은 현실을 직관적으로 바라보고, 논리적으로 현실을 제대로 데이터베이스에 반영할 것인가에 대한 것 이였다. 데이터베이스의 설계에서 가장 중요한 것은 현실을 제대로 반영하는 것이며, 이를 어떻게 논리적으로 구성하는가를 결정하는 것이다. 특히 관계형 데이터 모델에서는 데이터 값들이 2차원의 평면 테이블 형태로 표현하므로 어떤 릴레이션들이 필요하고, 어떤 애트리뷰트가 필요한가를 결정하는 것이 중요하다.
[edit]
2 함수적 종속 #그럼 “함수적 종속” 이란 것이 무엇인가 살펴보도록 하겠다 일단 함수라 하면 다음의 그림과 같이 나타낼 수 있다.
![]() 이것을 테이블로 표현한다면 다음과 같다.
![]() 일단 함수적 종속이란 말에서 함수라는 것에 대해서 살펴보도록 하겠다. 함수가 무엇인가? 다음의 그림을 보고서 설명을 하도록 하겠다
![]() 그림처럼 왼쪽은 2라는 원소가 두 개가 들어 있다. 2를 어떤 함수에 집어 넣어야지 4가 될까? 일반적으로 생각해 보면 2의 제곱을 구하는 함수에 값을 집어 넣는다면 4가 된다. 그러나 역으로 4를 집어 넣는다면 16이 되버리는 것이다. 즉, 2와 –2는 4가 되기 위해서 함수적으로 종속되어 있는 것이다. 결국 4는 2와 –2가 4가 되기 위한 함수에 종속적이기 때문에 2의 제곱이라는 함수에 종속적이게 만드는 4는 “결정자”라고 부른다. 또한 2와 –2를 “종속자”라고 한다.
학생 릴레이션에서 ... 학번->이름 학번->학과 학번->학년 위에서 보는 바와 같이 학번은 이름, 학과, 학년을 결정하고 있다. 즉, 학생 릴레이션에서 각각의 학생을 유일하게 구분 지을 수 있는 속성은 학번으로 학번은 기본키의 역할을 하는 속성이다. 즉, 이름만 가지고는 각각의 학생을 알 수 없다는 것이다. 필자가 옛날에 휴학을 하려고 했는데 시간이 없어서 조교님께 휴학 신청을 대신해달라고 한 적이 있었다. 그런데 필자와 같은 이름을 가진 다른 사람이 있었는데 그 사람으로 휴학을 한적이 있어서 상당히 난감했던 적이 있다. 즉, 필자의 이름인 “이재학” 만 가지고는 정확성이 있는 정보가 될 수 없던 것이다. 만약 교수님께서 “이재학”을 불러오라 라고 한다면 이미 과에 “이재학”이란 이름을 가진 사람이 2명이라는 것을 아는 사람은 학번을 교수님께 되물을 것이다. 이렇듯 이름은 학번에 종속되어 있다는 것이다. 이름이 이재학이고, 학과가 정보통신공학과이고, 4학년인 학생은 필자 말고도 한 명이 더 있다. 즉, 이것들은 학번에 종속적이라는 것이다.
![]() 9555023, 이재학, 4학년, 정보통신공학과 라는 것은 한 명의 학생에 대한 데이터이다. 학번, 이름, 학년, 학과 중에 대표성을 띄고 있는 것은 학번이고, [9555023, 이재학], [9555023, 4학년], [9555023, 정보통신] 이라고 해야지만 정확한 정보를 표현할 수가 있는 것이죠. 앞에서 언급했듯이 [이재학, 4학년, 정보통신]이라고 해서 정확한 정보가 되는 것일까요? 당연히 학번이 9555023인 학생과 학번이 9839011인 학생을 구별하지 못하는데 문제가 있다. 이렇듯 학번은 이름, 학년, 학과를 결정하고, 이름, 학년, 학과는 학번에 종속적이다. 이렇게 데이터에 대한 의미를 표현한 것을 함수적 종속이라고 한다.
참고
함수 종속에 대한 증명된 추론 규칙 (R->릴레이션) (데이터베이스시스템, 이석호, 정익사) R1: (반사규칙) A B 이면 A->B 이다. R2: (첨가규칙) A->B 이면 AC->BC 이고 AC->B 이다. R3: (이행규칙) A->B 이고 B->C 이면 A->C 이다. R4: (분해규칙) A->BC 이면 A->B 이다. R5: (결합규칙) A->B 이고 A->C 이면 A->BC 이다. 정규화는 이러한 “함수적 종속”을 기본 원칙으로 하나의 의미를 가지는 집합으로 나누는 작업이다. 정규화는 1차 정규화, 2차 정규화, 3차 정규화, 보이스/코드 정규화, 4차 정규화, 5차 정규화, 도메인/키 정규화가 있다. 이 순서가 높아지는 단계의 정규화일수록 무결성은 강화되나 과도하게 테이블이 쪼개지므로 쓸 때 없는 부하가 걸릴 수 있다. 그러므로 현실을 감안해서 어느 정도 수준의 정규화까지 행해야 하는가를 결정해야 하다. 보통 실무에서는 3차 정규화와 보이스/코드 정규화까지 하다. 기본으로 3차 정규화까지는 해야 하며, 3차 정규화 과정을 마치고도 사용자의 요구사항에 의해서 여러 가지 이상들이 발생할 요지가 있다면 더 높은 차원의 정규화를 해야 하다. 이제 각 단계별 정규화에 대해서 설명하도록 하겠다.
[edit]
3 정규화 #정규화의 개념은 이미 설명하였다. 각각의 정규화에 대해서 알아보자.
1차 정규화 -. 반복되는 그룹이 없는 레코드 -. 반복그룹 제거 2차 정규화 -. 키가 아닌 데이터 항목들은 기본키에 완전히 함수적으로 종속된다 -. 기본키에 종속되도록 분리 3차 정규화 -. 키가 아닌 데이터 항목들은 기본키에 완전히 독립이고, 서로에게 독립이다 -. 이행종속 제거 말은 어렵지만 매우 쉽다. 이제까지 우리는 정규화에 대한 언급이 없이 정규화를 했었다. 중요한 것은 각각의 컬럼의 제자리에 맞게 두는 것이다. 이것은 주제중심으로 속성들끼리의 관계를 정의한 것과 같다. 다음의 그림을 보자. 각 화살표는 함수적 종속을 나타낸다.
![]() 첫 번째의 경우 (A, B, C) , (A, D) 로 정규화 할 수 있으며, 두 번째의 경우 (A, B), (B, C)와 같이 정규화된다. 정규화를 하기 전에 함수 종속도(FD)를 작성하면 3차 정규화는 자연스럽게 이루어 질 수 있다.
[edit]
4 1차 정규화 #하나의 릴레이션은 어떤 도메인의 집합이다. 각각의 속성은 해당 도메인에 속하는 단지 하나의 값(원자값)을 가져야 하다. 이것이 1차 정규화 이며, 실제로 1차 정규화도 거치지 않은 테이블이 많이 존재하다. 예를 들면 다중값 속성들이 그대로 표현될 때 정규화된 테이블이 아닌 즉, 비정규화 테이블인 것이다. 사원테이블에 사번, 이름, 보유기술, 월급의 속성이 있는데 보유기술은 여러 개를 가질 수 있다는 현실을 생각해 보도록 하겠다. 일반적으로 문서를 만들면 다음과 같은 문서가 나올 수 있다. 보유기술에서 하나의 속성값에 여러 개의 값이 들어간 것을 볼 수 있다. 이러한 표현은 비정규화 된 테이블이다. 여기서 기본키는 사원번호이다.
![]() 그렇다고 다음과 같이 보유기술을 옆으로 펼친다고 해서 달라지는 것은 없다. 이도 역시 1차 정규화된 테이블이 아니라고 볼 수 있다. 의미상으로 보유기술1, 보유기술2, 보유기술3는 그냥 보유기술의 종류일 뿐이다. 그러니 하나의 속성에 여러 개의 값을 다른 표현으로 한 것 뿐이다.
![]() 어떤 사람든 보유기술 속성에 속성값을 넣는데 콤마로 구분하면 어떻겠냐? 라는 생각을 가질 수도 있다. 만약 사원번호 1111 인 사원의 보유기술을 하나 더 추가하려면 기본키가 “사원번호” 이므로 “사원번호”가 1111 인 사원이 추가되지 못하는 것을 알 수 있다. 즉, 다음과 같은 그림이 되어 삽입을 할 수 없는 형태가 되는 것이다.
![]() 이제 본격적인 정규화에 대해서 알아보겠다. 아래의 테이블은 각각의 학생에 대해서 각각의 속성마다 단일값을 가지고 있으므로 1차 정규화된 테이블이 이다. 여기서 독자들은 함수적 종속관계를 찾아보아야 할 것이다. 여러분은 찾아낸 함수적 종속성을 바탕으로 데이터가 많이 중복되어 있고, 그 데이터의 중복으로 인한 여러 가지 문제점(이상)들을 찾아내어야 한다.
![]() 이 테이블의 함수적 종속 다이어그램의 다음과 같다.
![]() 함수적 종속 다이어그램에서 보는 바와 같이 학번은 학생명과 학년을 결정하고, 학번은 학과를 결정하다. 또한 수강코드는 담당교수와 과목명을 결정하다. 각각의 학생은 자신이 수강 신청한 과목의 성적등급을 알기 위해서 학번과 수강코드가 필요하다. 담당교수는 학과를 결정한다. 여기서 자칫 잘못하면 학과가 담당교수를 결정할 수 있다고 볼 수 있는데 하나의 학과에 소속된 교수는 여러 명인 것이 보인다. 즉, 지도교수가 학과를 결정하는 것이지 학과가 교수를 결정하는 것이 아니다.
![]() 이 테이블은 학번만 가지고는 어떤 과목의 성적의 등급이 얼마인지를 모른다. 그러므로 이 테이블의 기본키는 학번 + 수강코드이다. 여기서 주의할 것은 수강코드라는 속성의 이름이 수강을 해야만 존재 코드가 아니라는 사실이다. 즉, 수강할 때 그 과목을 나타내는 과목의 고유번호를 나타내는 것이다.
[edit]
5 2차 정규화 #앞서서 삽입, 삭제, 갱신 이상들이 일어 날 수 있다는 것을 보았다. 1차 정규화된 테이블에서 이러한 문제점이 일어나는 원인이 무엇일까? 원인은 바로 기본키가 아닌 각각의 속성들이 기본키에 종속적이지 않고, 부분적으로 함수 종속이 되기 때문이다. 즉, 기본키를 제외한 모든 속성이 기본키에 함수적 종속이 아니기 때문이다. 이러한 문제를 해결하기 위해서는 기본키에 함수 종속을 시킨 것 끼리 따로 테이블을 만들어야 하다. 2차 정규화된 테이블은 다음과 같다 ( 테이블 밑은 점(...)은 생각치 않도록 하겠다 )
![]() 2차 정규화의 결과로 위와 같은 3개의 테이블이 나왔다 학생과 수강과목은 다:다의 관계를 맺고 있기 때문에 학생의 학번과 수강과목의 수강코드가 합쳐진 것을 기본키로 하여 학생 테이블과 수강과목 테이블을 연관 지어 주고 있다. 사실 데이터 모델링의 초기단계부터 차근 차근 진행해 오면서 엔티티만 제대로 도출해 냈다면 이와 같은 2차 정규화 작업은 필요가 없다 그러나 이와 같은 검증된 원리를 알고 있다면 애매모호 함이 없어지고, 좀더 정확한 정보를 산출하는 정보시스템이 만들어 질 수 있는 것이다.
학과 : 수강과목->1 : 다 삽입이상:
각 과목을 담당하는 교수가 특정 학과에 속한다는 사실을 삽입하려 할 때 과목이 존재하지 않는다면 이 사실을 삽입할 수 없다 즉, 각각의 행을 구분할 수 있는 대표성을 지닌 속성(기본키)가 존재하지 않으므로 삽입이 불가능하다는 것이다. 기본키는 수강과목 테이블에서 반드시 들어가야만 하는 것인데 이를 무시한 채 다른 속성값을 삽입하려 한 것이 문제이다. 만약 해당 학과의 커리큘럼이 바뀌어 오상훈 교수가 담당하고 있는 과목인 “자료구조”라는 과목이 없어진다면 오상훈 교수가 정보통신공학과에 소속된다는 사실도 없어지게 된다. 오상훈 교수가 정보통신공학과에 소속된다는 사실은 이행종속이 일어나고 있다는 것이며, 역시 2차 정규화된 테이블에서 일어나는 삭제이상도 이행 종속 때문이라는 것을 알 수 있다. 만약 박덕규 교수의 소속 학과가 정보통신에서 다른 학과로 변경된다면 박덕규 교수에 해당되는 학과에 대한 속성값을 모두 변경시켜 주어야 한다. 역시 이행종속이 일어나서 일어나는 이상현상이다. [edit]
6 3차 정규화 #2차 정규화된 테이블에서 이행 종속에 의해서 여러 가지 이상현상이 발생되는 것을 보았다. 이러한 여러 이상현상을 제거하려면 어떻게 해야 할까? 당연히 이상현상의 원인이 되었던 이행종속을 없애면 된다. 어떻게 없애야 할까? 당연히 이행종속을 일으키는 속성들을 묶어서 그룹 지어 주면 문제는 해결된다.
![]() 이렇게 이행 종속성을 제거한 테이블은 3차 정규화된 테이블이다. 만약 독자들 중에 여기까지 대충 읽어 본 분들은 아마도 정규화란 것이 테이블을 쪼개는 것이구나 라고 생각하시는 분들도 있을 것이다. 그러나 테이블을 쪼갠다는 개념을 갖지 말고, 좀더 세부적으로 관련성이 많은 것끼리 새로운 그룹을 만드는 개념으로 정규화를 생각하셔야 하다.
[edit]
7 보이스/코드 정규화 #3차 정규화도 여러 가지 이상이 존재하다. 그렇다면 이상이 발생하지 않는 정규화 과정은 어떤거냐고 의문을 가지는 분도 있을 것이다. 이상이 발생하지 않는 정규화는 키/도메인 정규화이다. 이것은 증명은 되었으나, 키/도메인 정규화 테이블을 만드는 구체적인 방법을 발견하지 못했기 때문에 실무에서 직관적으로 사용되는 방법이기도 하다. 그러나 보통 실무에서는 3차 정규화 과정이나 보이스/코드 정규화까지 한다. 그 이유는 일반적으로 4차 정규화나 5차 정규화 과정을 거쳐야 하는 상황은 거의 발생하지 않기 때문이다. 이 책에서는 보이스/코드 정규화 과정까지만 언급하겠다 만약 보이스/코드 정규화 과정을 거쳤으나 사용자가 원하는 작업을 수행할 때 이상이 발생한다면 4차 정규화 과정을 거쳐야 할 것이다. 4차, 5차 정규화는 다른 책을 참고해야 할 것이다.
![]() 앞서서 언급한 3차 정규화의 문제점인 후보키의 일부가 되는 속성인 “학번”이 중첩되어 있는 것이 보인다. 즉, 수강_교수 릴레이션의 후보키는 “학번 + 과목명”, “학번 + 담당교수” 이다. 이 후보키중 “학번 + 과목명”을 기본키라고 가정하겠다. 함수 종속 다이어그램에서 보는 바와 같이 “학번 + 과목명”은 “담당교수”를 결정하고, “담당교수”는 “과목명”을 결정한다. 이런 구조를 가지고 있는 릴레이션의 문제점을 파악해 보도록 하겠다.
삽입이상:
만약 이현태 교수도 자료구조를 담당하게 되었다면 수강신청을 한 학생이 있어야만 이와 같은 사실을 입력할 수 있다. 만약 “담당교수”의 의미가 해당 과목을 담당하고, 또한 그 학생에 대한 생활지도 등의 “지도”를 할 수 있다면(여기서는 담당과목을 수강하지 않은 학생도 지도할 수 있다는 가정), 과목을 수강하지 않은 학생은 지도교수가 누구인지 결정을 할 수 없게 된다. 학번이 “9655032” 인 학생이 자료구조의 수강 취소를 한다면 오용선 교수가 자료구조를 담당하고 있다는 사실도 함께 삭제된다. 이뿐만 아니라 다른 과목들도 마찬가지로 수강하는 학생이 수강을 취소한다면 과목에 대한 담당교수도 같이 삭제되므로 이상현상이 일어난다. 만약 다른 수강 신청자가 있다면 이와 같은 사실은 같이 삭제되지 않으나 현재 상황으로 볼 때 어떤 교수가 어떤 과목을 담당하고 있는지를 나타내는 것이 한 개의 투플(행)뿐이기 때문에 이러한 문제를 해결되어야 한다. 만약 이현태 교수가 “DB” 에서 “네트웍 프로그래밍”으로 담당과목이 바뀌었다면 3개의 투플(행)을 모두 변경해주어야 한다. 이러한 문제점은 보이스/코드 정규화 과정을 거치면 해결되는 문제이다. 즉, “모든 결정자가 후보키” 가 되게 하면 되는 것이다. 다음은 보이스/코드 정규화의 결과이다.
![]() 이제 1차 정규화에서 3차 정규화 까지를 종합적으로 살펴볼 필요가 있다. 즉, 이러한 원리만 알고 있다면 바로 3차 정규화 또는 보이스/코드 정규화까지 직접 도출이 가능하다. 직접 도출하는 예를 들어 보겠다 다음과 같은 스키마가 존재한다고 가정하겠다
지점명->자산 지정명->지점위치 대출번호->대출합계 대출번호->지점명 ![]() 도출한 R1, R2, R3, R4, R5는 모두 보이스/코드 정규형을 만족하다. 각각의 릴레이션의 모든 결정자가 후보키이다. 그러나 이렇게 너무 불필요한 정규화는 결과적으로 성능을 떨어뜨릴 수 있다. 그러므로 다음과 같은 통합작업을 거쳐야 하다.
R3_4 (대출번호, 지점명, 대출합계) R5 (대출번호, 고객명) [edit]
8 키/도메인 정규화 #'정규화란것은 '함수적 종속'관계를 파악하는 것이다. 이 종속관계를 파악하여 속성이 원래 갈 자리에 가게 하는 것이다. 즉, 주제에 맞는 한 객체가 관련된 업무에 관한 속성들이 있어야 할 곳에 있게 하는 것이다. 우리는 1차 정규화에서 보이스/코드 정규화까지 알아보았다 보통 실무에서는 3차 정규화나 보이스/코드 정규화 때에 따라서는 아주 가끔씩 4차 정규화를 행하다.
이것은 완벽한 정규화이다. 3차 정규형은 기본키에 모두 함수적 종속적인 것들로 테이블을 분리하고, 기본키가 아닌 속성들끼리의 종속성 즉, 이행종속을 일으키는 속성들을 다른 테이블로 옮기고 그 테이블에 기본키를 정의할 수 있으면 된다. 이와 같이 분리된 테이블은 기본키를 가지게 됩니다. 이러한 개념으로 테이블을 봤을 때 데이터가 중복되어 나타나는 것들 잘 살펴보면, 왜 중복이 일어났는지 알 수 있을 것이다. 그렇다고 정규화 과정을 무시해서는 안 된다. 이렇게 직관적으로 설계를 하면서 나갈 때는 정규화는 검증도구가 되는 것이다. 학자에 따라서 정규화는 검증도구다 또는 튜닝도구다라고 하는 의견들이 분분하다. 그러나 정규화는 반드시 필요한 것이 틀림이 없다. [edit]
9 정규화의 정리 #이제 앞에서 살펴보았던 정규화에 대해서 의미로만 따져 보도록 하겠다. 필자의 경우는 정규화 과정은 성능도구로 사용하는 편이다. 사실 함수적 종속이란 것이 조직의 범위내에서 통용되는 의미에 따라 틀려진다. 그러므로 모델링을 하기 전 단계에서부터 정보시스템을 구축하려는 조직에서 사용되는 정보의 의미를 파악하는 것이 더 중요하다고 하겠다.
![]() 제일 먼저 파악해야 할 것은 “관련성” 이다. 릴레이션이란 것이 속성들이 어떠한 관련성에 묶여서 있는 모습이다. 그러니 관련성이라는 의미는 매우 중요한 것이다. 이것은 기본키와의 관련성이다. 하나의 개체( 학생으로 하였을 경우 학번이 9555023인 학생 하나는 인스턴스이다.)를 대표하는 것이 기본키이기 때문이다.
|
“힘내라구.” 밤에 헤어질 때 아주 좋은 이야기를 나누었을 때든지 아무 관련 없이 로댕은 곧잘 내게 이렇게 말하는 것이었습니다. 그는 알고 있었던 겁니다. 젊었을 때 이 말이 날마다 얼마나 필요한 것인가를. (릴케) |