Search

DB Normalization

데이터베이스에 적재되는 데이터의 정돈은 곧 데이터베이스 상호작용의 성능을 높여준다. 잘 정렬된 데이터와 잘 정의된 스키마는 데이터베이스의 높은 확장성까지 꾀할 수 있다. 이 정돈과정을 Database Normalization(데이터베이스 정규화)이라 부른다.
DB의 정규화의 목표는 이상이 있는 관계를 재구성하여 작고 잘 조직된 관계를 생성하는 것에 있다. 이를 통해 데이터의 무결성(Integrity)을 유지할 수 있으며, DB의 저장 용량 역시 줄일 수 있다. 여러 단계에 걸쳐 이미 정의된 테이블을 분리하고 병합하며 정규화를 진행한다.

정규화의 종류

데이터 베이스의 정규화 단계는 1970년 Edgar F. Codd에 의해 도입되었다. 그는 제 1~3 정규화를 정의하여 대부분의 RDB에 대해 삽입, 변경, 삭제 이상이 나타나지 않도록 도왔으며, 이후 다른 이론가들에 의해 BC 정규화, 4정규화, 5정규화, 6정규화가 정의되었다. 1~3정규화를 통해 대부분의 RDB를 ‘정규화’할 수 있으며, 이렇게 정규화 된 RBD는 대부분 BC 정규화, 4정규화, 5정규화를 만족한다.
데이터 웨어하우스 디자인을 위한 관점 모델링과 같은 일부 모델링 규칙에서는 예외적으로 비 정규화된 디자인을 추천한다. 이는 곧, 정규화는 Relational-manner를 따르는 RDB에서만 유효하다는 것을 뜻한다. 일반적으로 대규모의 DB 디자인은 제 3 정규화 수준이 아니다.

정규화의 목적

DB 변경 시 이상현상(Anomaly) 제거
충분히 정규화 되지 않은 테이블은 데이터 갱신, 삽입, 삭제시 원치않은 이상현상이 발생할 수 있다. 그 예는 다음과 같다.
갱신 이상: 특정 관계에 얽힌 서로 다른 열의 정보가 복수개의 행에서 표현되면, 갱신 시 논리적 모순을 초래할 수 있다.
위 테이블을 예로, Employee 519에 접근하여 Employee Address를 갱신하는 작업에서, 성공적인 갱신이 이루어지지 않을 경우 즉, 변경된 직원의 주소가 그가 가지고 있는 레코드 중에서 일부는 변경되었으나 일부는 변경되지 않을 경우, 테이블은 모순 상태가 된다.
삽입 이상: Not-Null과 같은 특정 제약을 가지고 있는 열에 어긋나는 값을 삽입하면 삽입이 불가능해질 수 있다.
위 테이블을 예로, 아직 수업을 배정받지 않은 신입 교수 Dr. Newsome은 Null값의 Course Code를 가지게 되어, 불쌍하게도 테이블에 교수의 레코드를 삽입할 수가 없다.
삭제 이상: 어떤 정보를 삭제하는데, 삭제되면 안 되는 다른 사실이 함께 삭제되는 현상이 있을 수 있다.
위 테이블을 예로, ENG-206 수업이 끝나 해당 레코드를 삭제하면, Dr. Giddens 교수의 모든 정보가 삭제된다.
DB 구조 확장 시 재 디자인 최소화
정규화된 데이터베이스 구조에서는 새로운 데이터 형의 추가로 인한 확장시, 그 구조를 변경하지 않아도 되거나 일부만 변경해도 되는 경우가 있다. 이는 이 데이터베이스와 연동된 응용 프로그램에 최소한의 영향만을 주며, 응용 프로그램의 생명을 연장시킨다.
사용자에게 더욱 의미있는(Informative) 데이터 모델
정규화된 테이블들과 정규화된 테이블들간의 관계들은 현실세계에서의 개념들과 그들간의 관계들을 반영한다.
다양한 질의 지원
정규화된 테이블은 일반적인 목적의 질의에 적합하다. 일반적인 목적의 질의들은 SQL을 통한 ORDER, GROUP 연산이나 JOIN을 통해 이루어질 수 있으며, 이는 데이터 분석의 관점에서 보았을 때는 세부사항이 예측되지 않은 장래의 질의 또한 포함한다. 한마디로, 정규화 된 테이블을 통해 사용자가 일반적으로 제시 수 있는 질의들에 답을 내릴 수 있다. 정규화 되지 않은 테이블은 어떠한 질의에 대해 결론을 도출하지 못할 가능성이 있다.

정규화 용어

Primary Key
Primary key(일차 키)란, RDB에서 관계(테이블) 내의 특정 레코드를 식별할 수 있는 키 필드이다. 해당 관계 내에서 Primary key는 유일성을 띄어 레코드의 검색이나 정렬 작업에 우선적으로 참조된다.
관계 내의 키 필드가 하나밖에 없을 때에는 자동적으로 그 관계의 Primary key가 된다. 그러나 하나의 관계 내에 복수의 키가 있을 때에는 그중의 하나를 Primary key로 지정해야 한다. Primary key로 지정되지 않았지만 Primary key의 특성을 만족하는 키를 Alternate key(대체 키)라고 한다.
Super Key
Super key(슈퍼 키)는 레코드를 유일하게 식별해낼 수 있는 속성군을 뜻한다. 하나 또는 복수의 속성 집합이 전체 테이블에 걸쳐 유일한 값의 조합을 이룬다면 Super key가 될 수 있다.
한 개의 테이블은 여러 개의 Super key를 가질 수 있다.
Candidate Key
Candidate key(후보 키)는 레코드를 유일하게 식별하는 Super key의 조건을 만족하기 위해 필요없는 속성을 제거하여 이룬 최소한의 집합이다. Candidate key는 언제나 Super key의 부분집합이다.
Non-Prime Attribute
Non-Prime Attribute(비일차 속성)는 어떤 Candidate key에도 나타나지 않는 속성이다.
Functional Dependency
Functional Dependency(함수 종속성)란, 관계 스키마 중에서 어느 속성군의 값이 정해지면 다른 속성군의 값이 정해지는 것이다. 속성군은 하나 또는 복수의 속성으로 구성되며, 선행되는 속성군에 대한 어떤 임의의 값은 다른 속성군의 값 중 하나에 반드시 대응된다.
A, B가 각각 관계 R의 속성군인 경우, 임의 시점에서 A의 어떤 값도 반드시 B의 하나의 값에 대응되지만, B의 하나의 값이 A의 복수의 값에 대응되는 경우에 B는 A에 함수 종속이라고 하며 A→B와 같이 표기한다. 이 떄 A를 결정자, B를 종속자라고 한다.
Full-Functional Dependency
Full-Functional Dependency(완전 함수 종속성)란, 테이블에 존재하는 함수 종속의 모든 결정자의 조합에 대해 종속자가 될 수 있는 경우이다.
A, B가 각각 관계 R의 속성이고 B가 A에 함수 종속인 경우, A의 임의의 부분 집합에 대하여 B의 어떤 값도 A의 부분 집합의 값에 대응하지 않으면 B는 A에 완전 함수 종속이라고 한다.
Transitive Functional Dependency
Transitive Functional Dependency(이행함수 종속성)란, A, B, C가 각각 관계 R에 상호 중복되지 않는 속성(다만, A는 Primary Key 이외의 속성)인 경우에, A가 B에 함수 종속적이 아니면 이때 C는 A에 이행함수 종속이라고 한다. A->B 이고 B->C 일 경우에만 A->C 이면 이행함수(적) 종속이라고 한다.
Multi Valued Dependency
Multi Valued Dependency(다치 종속성)은 어떤 레코드의 존재가 다른 레코드의 존재로 이어짐을 의미한다. 다치종속성은->>으로 표시하는데, R{A,B,C}일 때 (A,C)->>{B}≡(A) ->{B} 성립한다. , A->>B이면 A->>C도 성립하고 A->>B│C이다. (Fagin정리에 따라) R{A,B,C}에서 다치종속 A->>B│C이면 R1{A,B}와 R2{A,C}로 무손실 분해가 가능하다.
Join Dependency
Join Dependency(조인종속)는 릴레이션 R이 그의 프로젝션 A,B,.....,Z의 조인과 동일하면 R은 JD*(A,B,....,Z )를 만족한다. 이때 A,B,....,Z는 R의 애트리뷰트에 대한 부분집합이다. 다시말해서 테이블 R이 R의 속성의 부분집합을 가지는 여러 개의 테이블들을 조인하여 만들어질 수 있을 때, R은 조인 종속성을 가진다고 한다.

1NF

Atomic Value
1NF(First Normal Form; 제 1 정규화)란, 릴레이션에 속한 모든 속성의 도메인이 원자 값(Atomic Value; 단일 값)으로만 구성되어 있는 상태이다. 테이블의 컬럼이 원자값을 갖도록 레코드를 분해하고 갱신 하는것이다.
위의 테이블에서 첫번쨰 레코드는 Subject 속성에 두개의 값을 가지며 원자성을 만족하지 못한다.
이를 또 다른 레코드로 분해하여 1NF를 만족시킨다.

2NF

2NF(Second Normal Form; 제 2 정규화)란, 1NF를 만족하며 Candidate Key를 제외한 모든 속성이 Candidate Key에 완전 함수적 종속을 가지는 상태이다. 일반적으로 테이블의 속성을 분해하여 새로운 테이블을 만듦으로써 복수의 Primary key 속성을 가지도록 재구성한다.
위의 테이블에서 Candidate key는 Student와 Subject이며, Age 속성은 Student 속성에 종속적이다.
이 속성을 분해하여 2NF를 만족시킨다.

3NF

3NF(Third Normal Form; 제 3 정규화)란, 2NF를 만족하며 기본키를 제외한 속성들 간의 이행적 함수 종속이 없는 상태이다.
위 속성군에서 Zip 속성은 Student_id 속성에 종속되어 있지만, Zip 속성에 종속되어있는 Street, city, State 속성은 Student_id 속성에 종속되어있지 않다.
이 속성들을 분해하여 3NF를 만족시킨다.