정규화, 비정규화는
데이터베이스 설계에 사용되는 프로세스이다.
쉽게 말하면 정규화는 여러 규칙(제약조건)을 사용해
데이터베이스를 완벽하게(이상현상 없게) 설계하는 방법이고
이를 통해 데이터베이스에 저장된 데이터의 무결성을 향상시킨다.
비정규화는 데이터베이스의 완벽한 구조설계를 포기하고
데이터의 무결성을 떨어트리는 대신 데이터베이스의
읽기(Read)성능 향상을 위한 설계 방법이다.
(정규화 비정규화에 대한 정의는 조금씩 다르지만 내용은 같으니 걱정하지 말자.)
이 챕터에서는 정규화(Normalization)를 살펴보자(비정규화 링크는 여기)
정규화 방법은 문제가 생길 수 있는 커다란 테이블을
문제가 없도록 작은 테이블로 나누는 것이다.
하지만 나누는 정도에 따라 규칙(제약조건)이 있고
그 정도를 정규형(Normal Form)이라고 부른다.
정규형은 1NF, 2NF, 3NF, BCNF, 4NF, 5NF, 6NF가 있는데
차수가 높아질수록 규칙(제약조건)이 까다로워진다.
그래서 일반적으로는 1~3NF(또는 ~BCNF)까지만 사용하고
나머지 정규형은 학문적 용도(전공, 수업, 논문 등)로 사용된다.
1NF(제1 정규형)
테이블(릴레이션)에 각 도메인은 원자성(Atomicity)을 가진다.
아래 <강사>테이블처럼 각 셀이 더 작게 나눌 수 없는 단일 값을 가진다는 말이다.
2NF(제2 정규형)
우선 2NF는 1NF를 먼저 충족시켜야 진행할 수 있다.
그다음 속성 값의 결정이 기본키(또는 복합키)의 전체를 참조해야 2NF를 충족한다는 것이다.
무슨 말인지 아래 그림을 보며 이해해 보자.
1NF의 키는 복합키{이름, 담당수업}이다. 왜 {이름} 하나가 아니냐면
키는 행(row)을 유일하게 식별할 수 있는 값이어야 하는데 {이름}에는 [제니퍼]가 2명이나 있다.
하지만 {이름, 담당수업}이면 행(row)을 유일하게 식별할 수 있다.
(복합키는 최소한의 속성의 조합으로 만들어야 하기 때문에 {이름, 담당수업, 국적} 모두 복합키로 쓰는 건 옳지 않다)
그러면 키를 제외한 속성은 {국적}이 된다.
2NF 정의에 따라서 속성{국적}의 결정은 키 전체{이름, 담당수업}를 참조해야 한다.
근데 문제는 속성{국적}의 결정이 복합키에 있는 {이름} 한 개만으로도 결정할 수 있다는 것이다.
즉, {이름}만 알아도 {국적}을 알 수 있다는 뜻이다.
그러면 속성값이 기본키(또는 복합키) 전체를 참조하게 만들도록 테이블을 분리해보자.
복합키 중 일부인 {이름}만으로도 {국적}을 알 수 있는 문제가 있었으니 [이름, 국적] 테이블을 만들면 된다.
그러면 위 그림(2NF)처럼 두 테이블로 나뉜다.
2NF의 첫 번째 테이블은 결정할 속성은 없지만 복합키{이름, 담당수업} 전체가 테이블을 이루고
두 번째 테이블은 속성{국적}이 키 전체{이름}를 참조해 2NF조건을 충족한다.
3NF(제3 정규형)
3NF도 2NF를 충족시킨 상태에서 진행할 수 있다.
3NF는 모든 속성이 기본키(또는 복합키)에 이행적 함수 종속이 되지 않아야 한다.
말이 너무 어렵지만 이행적 함수 종속이란
X→Y이고 Y→Z면 X→Z가 되는 것을 말한다.
예제를 보면서 이해해보자.
(※아래 2NF테이블이 어떻게 2NF조건을 충족하는지 스스로 체크해보자)
위 2NF테이블에서 복합키{강의시간, 이름}가 속성{담당수업}을 결정한다. (X→Y)
그리고 속성{담당수업}은 또 다른 속성{수업코드}을 결정할 수 있다. (Y→Z)
여기서 X→Z인 복합키{강의시간, 이름}→속성{수업코드}도 자연스럽게
성립해버려서 속성이 키에 이행적 함수 종속으로 3NF를 충족하지 못한다.
3NF로 만드는 방법은 간단하다 위 그림(3NF)처럼 (X→Y), (Y→Z) 테이블을 따로 분리해주면 된다.
최대한 쉽게 설명해보려고 애썼으나 처음 접해본 사람은 어려울 수 있다.
(제가 설명을 잘 못하는 걸 수도...ㅠㅠ)
위에서는 쉽게 설명하기 위해 속성 수가 적은 테이블로 예를 들었지만
테이블이 복잡해질수록 3NF정규형을 만족한다고 해도
이상현상(삽입이상, 갱신이상 ,삭제이상)가 발생 가능하다.
이 문제를 해결하기 위해 더 자세히 공부하려면
BCNF(Boyce-Codd Normal Form)까지 공부해보길 바란다.
'공부-Data Engineer > 데이터베이스' 카테고리의 다른 글
[쉽게 설명한] 데이터 웨어하우스 (0) | 2020.06.15 |
---|---|
[쉽게 설명한] 데이터베이스 비정규화, 역정규화 (1) | 2020.06.10 |
[쉽게 설명한] OLTP, OLAP (0) | 2020.06.09 |
[쉽게 설명한] NoSQL (0) | 2020.06.08 |
[쉽게 설명한] 관계형 데이터베이스 (0) | 2020.06.04 |